<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Lau Joe / Soar Freely</title>
        <link>https://www.laujoe.top/</link>
        <description>Recent content on Lau Joe / Soar Freely</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>en-us</language>
        <copyright>Lau Joe &amp; Soar Freely All rights reserved. 如需转载与引用，请注明文章链接及作者。</copyright>
        <lastBuildDate>Mon, 02 Feb 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://www.laujoe.top/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>「SF周刊」导航</title>
        <link>https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A%E5%AF%BC%E8%88%AA/</link>
        <pubDate>Mon, 02 Feb 2026 00:00:00 +0000</pubDate>
        
        <guid>https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A%E5%AF%BC%E8%88%AA/</guid>
        <description>&lt;img src="https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A%E5%AF%BC%E8%88%AA/20250101-home.jpg" alt="Featured image of post 「SF周刊」导航" /&gt;






    

    

    
        
    

    
        
    

    
        
    

    
        
    

    
        
    

    
        
    

    
        
    

    
        
    

    
        
    

    
        
    

    
        
    

    
        
    

    
        
    

    
        
    

    
        
    

    
        
    

    
        
    

    
        
    

    
        
    

    
        
    

    
        
    

    
        
    

    
        
    

    
        
    

    
        
    

    
        
    

    
        
    

    

    

    

    

    

    

    

    

    

    

    

    

    

    

    

    

    

    

    

    

    

    

    

    





    
    
    &lt;div class=&#34;sf-gallery-large&#34;&gt;
        
            
            &lt;div class=&#34;sf-year-header&#34;&gt;
                &lt;span class=&#34;sf-year-num&#34;&gt;2025&lt;/span&gt;
                &lt;span class=&#34;sf-year-line&#34;&gt;&lt;/span&gt;
            &lt;/div&gt;

            &lt;div class=&#34;sf-grid&#34;&gt;
                
                    
                    
                    
                    
                    
                    
                        
                    

                    &lt;a href=&#34;https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A2025%E5%B9%B4%E7%AC%AC33%E6%9C%9F%E6%80%BB%E7%AC%AC33%E6%9C%9F/&#34; class=&#34;sf-card&#34; target=&#34;_blank&#34;&gt;
                        &lt;div class=&#34;sf-visual&#34;&gt;
                            
                                &lt;img src=&#34;https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A2025%E5%B9%B4%E7%AC%AC33%E6%9C%9F%E6%80%BB%E7%AC%AC33%E6%9C%9F/20251019-home.jpg&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34; alt=&#34;&#34;&gt;
                            
                        &lt;/div&gt;
                        
                        &lt;div class=&#34;sf-info&#34;&gt;
                            &lt;div class=&#34;sf-meta&#34;&gt;
                                &lt;span class=&#34;sf-date&#34;&gt;2025.10.19&lt;/span&gt;
                                
                                    &lt;span class=&#34;sf-tag&#34;&gt;#2025年SF周刊&lt;/span&gt;
                                
                            &lt;/div&gt;
                            
                            
                            &lt;h3 class=&#34;sf-title&#34;&gt;「SF周刊」2025年第33期（总第33期）&lt;/h3&gt;
                            
                            
                        &lt;/div&gt;
                    &lt;/a&gt;
                
                    
                    
                    
                    
                    
                    
                        
                    

                    &lt;a href=&#34;https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A2025%E5%B9%B4%E7%AC%AC31-32%E6%9C%9F%E5%90%88%E5%88%8A%E6%80%BB%E7%AC%AC31-32%E6%9C%9F/&#34; class=&#34;sf-card&#34; target=&#34;_blank&#34;&gt;
                        &lt;div class=&#34;sf-visual&#34;&gt;
                            
                                &lt;img src=&#34;https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A2025%E5%B9%B4%E7%AC%AC31-32%E6%9C%9F%E5%90%88%E5%88%8A%E6%80%BB%E7%AC%AC31-32%E6%9C%9F/20251009-home.jpg&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34; alt=&#34;&#34;&gt;
                            
                        &lt;/div&gt;
                        
                        &lt;div class=&#34;sf-info&#34;&gt;
                            &lt;div class=&#34;sf-meta&#34;&gt;
                                &lt;span class=&#34;sf-date&#34;&gt;2025.10.09&lt;/span&gt;
                                
                                    &lt;span class=&#34;sf-tag&#34;&gt;#2025年SF周刊&lt;/span&gt;
                                
                            &lt;/div&gt;
                            
                            
                            &lt;h3 class=&#34;sf-title&#34;&gt;「SF周刊」2025年第31 32期（合刊）（总第31-32期）&lt;/h3&gt;
                            
                            
                        &lt;/div&gt;
                    &lt;/a&gt;
                
                    
                    
                    
                    
                    
                    
                        
                    

                    &lt;a href=&#34;https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A2025%E5%B9%B4%E7%AC%AC29-30%E6%9C%9F%E5%90%88%E5%88%8A%E6%80%BB%E7%AC%AC29-30%E6%9C%9F/&#34; class=&#34;sf-card&#34; target=&#34;_blank&#34;&gt;
                        &lt;div class=&#34;sf-visual&#34;&gt;
                            
                                &lt;img src=&#34;https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A2025%E5%B9%B4%E7%AC%AC29-30%E6%9C%9F%E5%90%88%E5%88%8A%E6%80%BB%E7%AC%AC29-30%E6%9C%9F/20250926-home.jpg&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34; alt=&#34;&#34;&gt;
                            
                        &lt;/div&gt;
                        
                        &lt;div class=&#34;sf-info&#34;&gt;
                            &lt;div class=&#34;sf-meta&#34;&gt;
                                &lt;span class=&#34;sf-date&#34;&gt;2025.09.26&lt;/span&gt;
                                
                                    &lt;span class=&#34;sf-tag&#34;&gt;#2025年SF周刊&lt;/span&gt;
                                
                            &lt;/div&gt;
                            
                            
                            &lt;h3 class=&#34;sf-title&#34;&gt;「SF周刊」2025年第29 30期（合刊）（总第29-30期）&lt;/h3&gt;
                            
                            
                        &lt;/div&gt;
                    &lt;/a&gt;
                
                    
                    
                    
                    
                    
                    
                        
                    

                    &lt;a href=&#34;https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A2025%E5%B9%B4%E7%AC%AC27-28%E6%9C%9F%E5%90%88%E5%88%8A%E6%80%BB%E7%AC%AC27-28%E6%9C%9F/&#34; class=&#34;sf-card&#34; target=&#34;_blank&#34;&gt;
                        &lt;div class=&#34;sf-visual&#34;&gt;
                            
                                &lt;img src=&#34;https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A2025%E5%B9%B4%E7%AC%AC27-28%E6%9C%9F%E5%90%88%E5%88%8A%E6%80%BB%E7%AC%AC27-28%E6%9C%9F/20250915-home.jpg&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34; alt=&#34;&#34;&gt;
                            
                        &lt;/div&gt;
                        
                        &lt;div class=&#34;sf-info&#34;&gt;
                            &lt;div class=&#34;sf-meta&#34;&gt;
                                &lt;span class=&#34;sf-date&#34;&gt;2025.09.15&lt;/span&gt;
                                
                                    &lt;span class=&#34;sf-tag&#34;&gt;#2025年SF周刊&lt;/span&gt;
                                
                            &lt;/div&gt;
                            
                            
                            &lt;h3 class=&#34;sf-title&#34;&gt;「SF周刊」2025年第27 28期（合刊）（总第27-28期）&lt;/h3&gt;
                            
                            
                        &lt;/div&gt;
                    &lt;/a&gt;
                
                    
                    
                    
                    
                    
                    
                        
                    

                    &lt;a href=&#34;https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A2025%E5%B9%B4%E7%AC%AC25-26%E6%9C%9F%E5%90%88%E5%88%8A%E6%80%BB%E7%AC%AC25-26%E6%9C%9F/&#34; class=&#34;sf-card&#34; target=&#34;_blank&#34;&gt;
                        &lt;div class=&#34;sf-visual&#34;&gt;
                            
                                &lt;img src=&#34;https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A2025%E5%B9%B4%E7%AC%AC25-26%E6%9C%9F%E5%90%88%E5%88%8A%E6%80%BB%E7%AC%AC25-26%E6%9C%9F/20250901-home.jpg&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34; alt=&#34;&#34;&gt;
                            
                        &lt;/div&gt;
                        
                        &lt;div class=&#34;sf-info&#34;&gt;
                            &lt;div class=&#34;sf-meta&#34;&gt;
                                &lt;span class=&#34;sf-date&#34;&gt;2025.09.01&lt;/span&gt;
                                
                                    &lt;span class=&#34;sf-tag&#34;&gt;#2025年SF周刊&lt;/span&gt;
                                
                            &lt;/div&gt;
                            
                            
                            &lt;h3 class=&#34;sf-title&#34;&gt;「SF周刊」2025年第25 26期（合刊）（总第25-26期）&lt;/h3&gt;
                            
                            
                        &lt;/div&gt;
                    &lt;/a&gt;
                
                    
                    
                    
                    
                    
                    
                        
                    

                    &lt;a href=&#34;https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A2025%E5%B9%B4%E7%AC%AC24%E6%9C%9F%E6%80%BB%E7%AC%AC24%E6%9C%9F/&#34; class=&#34;sf-card&#34; target=&#34;_blank&#34;&gt;
                        &lt;div class=&#34;sf-visual&#34;&gt;
                            
                                &lt;img src=&#34;https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A2025%E5%B9%B4%E7%AC%AC24%E6%9C%9F%E6%80%BB%E7%AC%AC24%E6%9C%9F/20250819-home.jpg&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34; alt=&#34;&#34;&gt;
                            
                        &lt;/div&gt;
                        
                        &lt;div class=&#34;sf-info&#34;&gt;
                            &lt;div class=&#34;sf-meta&#34;&gt;
                                &lt;span class=&#34;sf-date&#34;&gt;2025.08.19&lt;/span&gt;
                                
                                    &lt;span class=&#34;sf-tag&#34;&gt;#2025年SF周刊&lt;/span&gt;
                                
                            &lt;/div&gt;
                            
                            
                            &lt;h3 class=&#34;sf-title&#34;&gt;「SF周刊」2025年第24期（总第24期）&lt;/h3&gt;
                            
                            
                        &lt;/div&gt;
                    &lt;/a&gt;
                
                    
                    
                    
                    
                    
                    
                        
                    

                    &lt;a href=&#34;https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A2025%E5%B9%B4%E7%AC%AC22-23%E6%9C%9F%E5%90%88%E5%88%8A%E6%80%BB%E7%AC%AC22-23%E6%9C%9F/&#34; class=&#34;sf-card&#34; target=&#34;_blank&#34;&gt;
                        &lt;div class=&#34;sf-visual&#34;&gt;
                            
                                &lt;img src=&#34;https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A2025%E5%B9%B4%E7%AC%AC22-23%E6%9C%9F%E5%90%88%E5%88%8A%E6%80%BB%E7%AC%AC22-23%E6%9C%9F/20250811-home.jpg&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34; alt=&#34;&#34;&gt;
                            
                        &lt;/div&gt;
                        
                        &lt;div class=&#34;sf-info&#34;&gt;
                            &lt;div class=&#34;sf-meta&#34;&gt;
                                &lt;span class=&#34;sf-date&#34;&gt;2025.08.11&lt;/span&gt;
                                
                                    &lt;span class=&#34;sf-tag&#34;&gt;#2025年SF周刊&lt;/span&gt;
                                
                            &lt;/div&gt;
                            
                            
                            &lt;h3 class=&#34;sf-title&#34;&gt;「SF周刊」2025年第22 23期（合刊）（总第22-23期）&lt;/h3&gt;
                            
                            
                        &lt;/div&gt;
                    &lt;/a&gt;
                
                    
                    
                    
                    
                    
                    
                        
                    

                    &lt;a href=&#34;https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A2025%E5%B9%B4%E7%AC%AC21%E6%9C%9F%E6%80%BB%E7%AC%AC21%E6%9C%9F/&#34; class=&#34;sf-card&#34; target=&#34;_blank&#34;&gt;
                        &lt;div class=&#34;sf-visual&#34;&gt;
                            
                                &lt;img src=&#34;https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A2025%E5%B9%B4%E7%AC%AC21%E6%9C%9F%E6%80%BB%E7%AC%AC21%E6%9C%9F/20250729-home.jpg&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34; alt=&#34;&#34;&gt;
                            
                        &lt;/div&gt;
                        
                        &lt;div class=&#34;sf-info&#34;&gt;
                            &lt;div class=&#34;sf-meta&#34;&gt;
                                &lt;span class=&#34;sf-date&#34;&gt;2025.07.29&lt;/span&gt;
                                
                                    &lt;span class=&#34;sf-tag&#34;&gt;#2025年SF周刊&lt;/span&gt;
                                
                            &lt;/div&gt;
                            
                            
                            &lt;h3 class=&#34;sf-title&#34;&gt;「SF周刊」2025年第21期（总第21期）&lt;/h3&gt;
                            
                            
                        &lt;/div&gt;
                    &lt;/a&gt;
                
                    
                    
                    
                    
                    
                    
                        
                    

                    &lt;a href=&#34;https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A2025%E5%B9%B4%E7%AC%AC20%E6%9C%9F%E6%80%BB%E7%AC%AC20%E6%9C%9F/&#34; class=&#34;sf-card&#34; target=&#34;_blank&#34;&gt;
                        &lt;div class=&#34;sf-visual&#34;&gt;
                            
                                &lt;img src=&#34;https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A2025%E5%B9%B4%E7%AC%AC20%E6%9C%9F%E6%80%BB%E7%AC%AC20%E6%9C%9F/20250721-home.jpg&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34; alt=&#34;&#34;&gt;
                            
                        &lt;/div&gt;
                        
                        &lt;div class=&#34;sf-info&#34;&gt;
                            &lt;div class=&#34;sf-meta&#34;&gt;
                                &lt;span class=&#34;sf-date&#34;&gt;2025.07.21&lt;/span&gt;
                                
                                    &lt;span class=&#34;sf-tag&#34;&gt;#2025年SF周刊&lt;/span&gt;
                                
                            &lt;/div&gt;
                            
                            
                            &lt;h3 class=&#34;sf-title&#34;&gt;「SF周刊」2025年第20期（总第20期）&lt;/h3&gt;
                            
                            
                        &lt;/div&gt;
                    &lt;/a&gt;
                
                    
                    
                    
                    
                    
                    
                        
                    

                    &lt;a href=&#34;https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A2025%E5%B9%B4%E7%AC%AC18-19%E6%9C%9F%E5%90%88%E5%88%8A%E6%80%BB%E7%AC%AC18-19%E6%9C%9F/&#34; class=&#34;sf-card&#34; target=&#34;_blank&#34;&gt;
                        &lt;div class=&#34;sf-visual&#34;&gt;
                            
                                &lt;img src=&#34;https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A2025%E5%B9%B4%E7%AC%AC18-19%E6%9C%9F%E5%90%88%E5%88%8A%E6%80%BB%E7%AC%AC18-19%E6%9C%9F/20250714-home.jpg&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34; alt=&#34;&#34;&gt;
                            
                        &lt;/div&gt;
                        
                        &lt;div class=&#34;sf-info&#34;&gt;
                            &lt;div class=&#34;sf-meta&#34;&gt;
                                &lt;span class=&#34;sf-date&#34;&gt;2025.07.14&lt;/span&gt;
                                
                                    &lt;span class=&#34;sf-tag&#34;&gt;#2025年SF周刊&lt;/span&gt;
                                
                            &lt;/div&gt;
                            
                            
                            &lt;h3 class=&#34;sf-title&#34;&gt;「SF周刊」2025年第18 19期（合刊）（总第18-19期）&lt;/h3&gt;
                            
                            
                        &lt;/div&gt;
                    &lt;/a&gt;
                
                    
                    
                    
                    
                    
                    
                        
                    

                    &lt;a href=&#34;https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A2025%E5%B9%B4%E7%AC%AC17%E6%9C%9F%E6%80%BB%E7%AC%AC17%E6%9C%9F/&#34; class=&#34;sf-card&#34; target=&#34;_blank&#34;&gt;
                        &lt;div class=&#34;sf-visual&#34;&gt;
                            
                                &lt;img src=&#34;https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A2025%E5%B9%B4%E7%AC%AC17%E6%9C%9F%E6%80%BB%E7%AC%AC17%E6%9C%9F/20250630-home.jpg&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34; alt=&#34;&#34;&gt;
                            
                        &lt;/div&gt;
                        
                        &lt;div class=&#34;sf-info&#34;&gt;
                            &lt;div class=&#34;sf-meta&#34;&gt;
                                &lt;span class=&#34;sf-date&#34;&gt;2025.06.30&lt;/span&gt;
                                
                                    &lt;span class=&#34;sf-tag&#34;&gt;#2025年SF周刊&lt;/span&gt;
                                
                            &lt;/div&gt;
                            
                            
                            &lt;h3 class=&#34;sf-title&#34;&gt;「SF周刊」2025年第17期（总第17期）&lt;/h3&gt;
                            
                            
                        &lt;/div&gt;
                    &lt;/a&gt;
                
                    
                    
                    
                    
                    
                    
                        
                    

                    &lt;a href=&#34;https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A2025%E5%B9%B4%E7%AC%AC16%E6%9C%9F%E6%80%BB%E7%AC%AC16%E6%9C%9F/&#34; class=&#34;sf-card&#34; target=&#34;_blank&#34;&gt;
                        &lt;div class=&#34;sf-visual&#34;&gt;
                            
                                &lt;img src=&#34;https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A2025%E5%B9%B4%E7%AC%AC16%E6%9C%9F%E6%80%BB%E7%AC%AC16%E6%9C%9F/20250622-home.jpg&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34; alt=&#34;&#34;&gt;
                            
                        &lt;/div&gt;
                        
                        &lt;div class=&#34;sf-info&#34;&gt;
                            &lt;div class=&#34;sf-meta&#34;&gt;
                                &lt;span class=&#34;sf-date&#34;&gt;2025.06.22&lt;/span&gt;
                                
                                    &lt;span class=&#34;sf-tag&#34;&gt;#2025年SF周刊&lt;/span&gt;
                                
                            &lt;/div&gt;
                            
                            
                            &lt;h3 class=&#34;sf-title&#34;&gt;「SF周刊」2025年第16期（总第16期）&lt;/h3&gt;
                            
                            
                        &lt;/div&gt;
                    &lt;/a&gt;
                
                    
                    
                    
                    
                    
                    
                        
                    

                    &lt;a href=&#34;https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A2025%E5%B9%B4%E7%AC%AC15%E6%9C%9F%E6%80%BB%E7%AC%AC15%E6%9C%9F/&#34; class=&#34;sf-card&#34; target=&#34;_blank&#34;&gt;
                        &lt;div class=&#34;sf-visual&#34;&gt;
                            
                                &lt;img src=&#34;https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A2025%E5%B9%B4%E7%AC%AC15%E6%9C%9F%E6%80%BB%E7%AC%AC15%E6%9C%9F/20250615-home.jpg&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34; alt=&#34;&#34;&gt;
                            
                        &lt;/div&gt;
                        
                        &lt;div class=&#34;sf-info&#34;&gt;
                            &lt;div class=&#34;sf-meta&#34;&gt;
                                &lt;span class=&#34;sf-date&#34;&gt;2025.06.15&lt;/span&gt;
                                
                                    &lt;span class=&#34;sf-tag&#34;&gt;#2025年SF周刊&lt;/span&gt;
                                
                            &lt;/div&gt;
                            
                            
                            &lt;h3 class=&#34;sf-title&#34;&gt;「SF周刊」2025年第15期（总第15期）&lt;/h3&gt;
                            
                            
                        &lt;/div&gt;
                    &lt;/a&gt;
                
                    
                    
                    
                    
                    
                    
                        
                    

                    &lt;a href=&#34;https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A2025%E5%B9%B4%E7%AC%AC14%E6%9C%9F%E6%80%BB%E7%AC%AC14%E6%9C%9F/&#34; class=&#34;sf-card&#34; target=&#34;_blank&#34;&gt;
                        &lt;div class=&#34;sf-visual&#34;&gt;
                            
                                &lt;img src=&#34;https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A2025%E5%B9%B4%E7%AC%AC14%E6%9C%9F%E6%80%BB%E7%AC%AC14%E6%9C%9F/20250608-home.jpg&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34; alt=&#34;&#34;&gt;
                            
                        &lt;/div&gt;
                        
                        &lt;div class=&#34;sf-info&#34;&gt;
                            &lt;div class=&#34;sf-meta&#34;&gt;
                                &lt;span class=&#34;sf-date&#34;&gt;2025.06.08&lt;/span&gt;
                                
                                    &lt;span class=&#34;sf-tag&#34;&gt;#2025年SF周刊&lt;/span&gt;
                                
                            &lt;/div&gt;
                            
                            
                            &lt;h3 class=&#34;sf-title&#34;&gt;「SF周刊」2025年第14期（总第14期）&lt;/h3&gt;
                            
                            
                        &lt;/div&gt;
                    &lt;/a&gt;
                
                    
                    
                    
                    
                    
                    
                        
                    

                    &lt;a href=&#34;https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A2025%E5%B9%B4%E7%AC%AC13%E6%9C%9F%E6%80%BB%E7%AC%AC13%E6%9C%9F/&#34; class=&#34;sf-card&#34; target=&#34;_blank&#34;&gt;
                        &lt;div class=&#34;sf-visual&#34;&gt;
                            
                                &lt;img src=&#34;https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A2025%E5%B9%B4%E7%AC%AC13%E6%9C%9F%E6%80%BB%E7%AC%AC13%E6%9C%9F/20250601-home.jpg&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34; alt=&#34;&#34;&gt;
                            
                        &lt;/div&gt;
                        
                        &lt;div class=&#34;sf-info&#34;&gt;
                            &lt;div class=&#34;sf-meta&#34;&gt;
                                &lt;span class=&#34;sf-date&#34;&gt;2025.06.01&lt;/span&gt;
                                
                                    &lt;span class=&#34;sf-tag&#34;&gt;#2025年SF周刊&lt;/span&gt;
                                
                            &lt;/div&gt;
                            
                            
                            &lt;h3 class=&#34;sf-title&#34;&gt;「SF周刊」2025年第13期（总第13期）&lt;/h3&gt;
                            
                            
                        &lt;/div&gt;
                    &lt;/a&gt;
                
                    
                    
                    
                    
                    
                    
                        
                    

                    &lt;a href=&#34;https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A2025%E5%B9%B4%E7%AC%AC12%E6%9C%9F%E6%80%BB%E7%AC%AC12%E6%9C%9F/&#34; class=&#34;sf-card&#34; target=&#34;_blank&#34;&gt;
                        &lt;div class=&#34;sf-visual&#34;&gt;
                            
                                &lt;img src=&#34;https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A2025%E5%B9%B4%E7%AC%AC12%E6%9C%9F%E6%80%BB%E7%AC%AC12%E6%9C%9F/20250525-home.jpg&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34; alt=&#34;&#34;&gt;
                            
                        &lt;/div&gt;
                        
                        &lt;div class=&#34;sf-info&#34;&gt;
                            &lt;div class=&#34;sf-meta&#34;&gt;
                                &lt;span class=&#34;sf-date&#34;&gt;2025.05.25&lt;/span&gt;
                                
                                    &lt;span class=&#34;sf-tag&#34;&gt;#2025年SF周刊&lt;/span&gt;
                                
                            &lt;/div&gt;
                            
                            
                            &lt;h3 class=&#34;sf-title&#34;&gt;「SF周刊」2025年第12期（总第12期）&lt;/h3&gt;
                            
                            
                        &lt;/div&gt;
                    &lt;/a&gt;
                
                    
                    
                    
                    
                    
                    
                        
                    

                    &lt;a href=&#34;https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A2025%E5%B9%B4%E7%AC%AC11%E6%9C%9F%E6%80%BB%E7%AC%AC11%E6%9C%9F/&#34; class=&#34;sf-card&#34; target=&#34;_blank&#34;&gt;
                        &lt;div class=&#34;sf-visual&#34;&gt;
                            
                                &lt;img src=&#34;https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A2025%E5%B9%B4%E7%AC%AC11%E6%9C%9F%E6%80%BB%E7%AC%AC11%E6%9C%9F/20250518-home.jpg&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34; alt=&#34;&#34;&gt;
                            
                        &lt;/div&gt;
                        
                        &lt;div class=&#34;sf-info&#34;&gt;
                            &lt;div class=&#34;sf-meta&#34;&gt;
                                &lt;span class=&#34;sf-date&#34;&gt;2025.05.18&lt;/span&gt;
                                
                                    &lt;span class=&#34;sf-tag&#34;&gt;#2025年SF周刊&lt;/span&gt;
                                
                            &lt;/div&gt;
                            
                            
                            &lt;h3 class=&#34;sf-title&#34;&gt;「SF周刊」2025年第11期（总第11期）&lt;/h3&gt;
                            
                            
                        &lt;/div&gt;
                    &lt;/a&gt;
                
                    
                    
                    
                    
                    
                    
                        
                    

                    &lt;a href=&#34;https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A2025%E5%B9%B4%E7%AC%AC10%E6%9C%9F%E6%80%BB%E7%AC%AC10%E6%9C%9F/&#34; class=&#34;sf-card&#34; target=&#34;_blank&#34;&gt;
                        &lt;div class=&#34;sf-visual&#34;&gt;
                            
                                &lt;img src=&#34;https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A2025%E5%B9%B4%E7%AC%AC10%E6%9C%9F%E6%80%BB%E7%AC%AC10%E6%9C%9F/20250511-home.jpg&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34; alt=&#34;&#34;&gt;
                            
                        &lt;/div&gt;
                        
                        &lt;div class=&#34;sf-info&#34;&gt;
                            &lt;div class=&#34;sf-meta&#34;&gt;
                                &lt;span class=&#34;sf-date&#34;&gt;2025.05.11&lt;/span&gt;
                                
                                    &lt;span class=&#34;sf-tag&#34;&gt;#2025年SF周刊&lt;/span&gt;
                                
                            &lt;/div&gt;
                            
                            
                            &lt;h3 class=&#34;sf-title&#34;&gt;「SF周刊」2025年第10期（总第10期）&lt;/h3&gt;
                            
                            
                        &lt;/div&gt;
                    &lt;/a&gt;
                
                    
                    
                    
                    
                    
                    
                        
                    

                    &lt;a href=&#34;https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A2025%E5%B9%B4%E7%AC%AC9%E6%9C%9F%E6%80%BB%E7%AC%AC9%E6%9C%9F/&#34; class=&#34;sf-card&#34; target=&#34;_blank&#34;&gt;
                        &lt;div class=&#34;sf-visual&#34;&gt;
                            
                                &lt;img src=&#34;https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A2025%E5%B9%B4%E7%AC%AC9%E6%9C%9F%E6%80%BB%E7%AC%AC9%E6%9C%9F/20250504-home.jpg&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34; alt=&#34;&#34;&gt;
                            
                        &lt;/div&gt;
                        
                        &lt;div class=&#34;sf-info&#34;&gt;
                            &lt;div class=&#34;sf-meta&#34;&gt;
                                &lt;span class=&#34;sf-date&#34;&gt;2025.05.03&lt;/span&gt;
                                
                                    &lt;span class=&#34;sf-tag&#34;&gt;#2025年SF周刊&lt;/span&gt;
                                
                            &lt;/div&gt;
                            
                            
                            &lt;h3 class=&#34;sf-title&#34;&gt;「SF周刊」2025年第9期（总第9期）&lt;/h3&gt;
                            
                            
                        &lt;/div&gt;
                    &lt;/a&gt;
                
                    
                    
                    
                    
                    
                    
                        
                    

                    &lt;a href=&#34;https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A2025%E5%B9%B4%E7%AC%AC8%E6%9C%9F%E6%80%BB%E7%AC%AC8%E6%9C%9F/&#34; class=&#34;sf-card&#34; target=&#34;_blank&#34;&gt;
                        &lt;div class=&#34;sf-visual&#34;&gt;
                            
                                &lt;img src=&#34;https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A2025%E5%B9%B4%E7%AC%AC8%E6%9C%9F%E6%80%BB%E7%AC%AC8%E6%9C%9F/20250427-home.jpg&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34; alt=&#34;&#34;&gt;
                            
                        &lt;/div&gt;
                        
                        &lt;div class=&#34;sf-info&#34;&gt;
                            &lt;div class=&#34;sf-meta&#34;&gt;
                                &lt;span class=&#34;sf-date&#34;&gt;2025.04.26&lt;/span&gt;
                                
                                    &lt;span class=&#34;sf-tag&#34;&gt;#2025年SF周刊&lt;/span&gt;
                                
                            &lt;/div&gt;
                            
                            
                            &lt;h3 class=&#34;sf-title&#34;&gt;「SF周刊」2025年第8期（总第8期）&lt;/h3&gt;
                            
                            
                        &lt;/div&gt;
                    &lt;/a&gt;
                
                    
                    
                    
                    
                    
                    
                        
                    

                    &lt;a href=&#34;https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A2025%E5%B9%B4%E7%AC%AC7%E6%9C%9F%E6%80%BB%E7%AC%AC7%E6%9C%9F/&#34; class=&#34;sf-card&#34; target=&#34;_blank&#34;&gt;
                        &lt;div class=&#34;sf-visual&#34;&gt;
                            
                                &lt;img src=&#34;https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A2025%E5%B9%B4%E7%AC%AC7%E6%9C%9F%E6%80%BB%E7%AC%AC7%E6%9C%9F/20250420-home.jpg&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34; alt=&#34;&#34;&gt;
                            
                        &lt;/div&gt;
                        
                        &lt;div class=&#34;sf-info&#34;&gt;
                            &lt;div class=&#34;sf-meta&#34;&gt;
                                &lt;span class=&#34;sf-date&#34;&gt;2025.04.20&lt;/span&gt;
                                
                                    &lt;span class=&#34;sf-tag&#34;&gt;#2025年SF周刊&lt;/span&gt;
                                
                            &lt;/div&gt;
                            
                            
                            &lt;h3 class=&#34;sf-title&#34;&gt;「SF周刊」2025年第7期（总第7期）&lt;/h3&gt;
                            
                            
                        &lt;/div&gt;
                    &lt;/a&gt;
                
                    
                    
                    
                    
                    
                    
                        
                    

                    &lt;a href=&#34;https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A2025%E5%B9%B4%E7%AC%AC6%E6%9C%9F%E6%80%BB%E7%AC%AC6%E6%9C%9F/&#34; class=&#34;sf-card&#34; target=&#34;_blank&#34;&gt;
                        &lt;div class=&#34;sf-visual&#34;&gt;
                            
                                &lt;img src=&#34;https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A2025%E5%B9%B4%E7%AC%AC6%E6%9C%9F%E6%80%BB%E7%AC%AC6%E6%9C%9F/20250413-home.jpg&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34; alt=&#34;&#34;&gt;
                            
                        &lt;/div&gt;
                        
                        &lt;div class=&#34;sf-info&#34;&gt;
                            &lt;div class=&#34;sf-meta&#34;&gt;
                                &lt;span class=&#34;sf-date&#34;&gt;2025.04.13&lt;/span&gt;
                                
                                    &lt;span class=&#34;sf-tag&#34;&gt;#2025年SF周刊&lt;/span&gt;
                                
                            &lt;/div&gt;
                            
                            
                            &lt;h3 class=&#34;sf-title&#34;&gt;「SF周刊」2025年第6期（总第6期）&lt;/h3&gt;
                            
                            
                        &lt;/div&gt;
                    &lt;/a&gt;
                
                    
                    
                    
                    
                    
                    
                        
                    

                    &lt;a href=&#34;https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A2025%E5%B9%B4%E7%AC%AC5%E6%9C%9F%E6%80%BB%E7%AC%AC5%E6%9C%9F/&#34; class=&#34;sf-card&#34; target=&#34;_blank&#34;&gt;
                        &lt;div class=&#34;sf-visual&#34;&gt;
                            
                                &lt;img src=&#34;https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A2025%E5%B9%B4%E7%AC%AC5%E6%9C%9F%E6%80%BB%E7%AC%AC5%E6%9C%9F/20250406-home.jpg&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34; alt=&#34;&#34;&gt;
                            
                        &lt;/div&gt;
                        
                        &lt;div class=&#34;sf-info&#34;&gt;
                            &lt;div class=&#34;sf-meta&#34;&gt;
                                &lt;span class=&#34;sf-date&#34;&gt;2025.04.06&lt;/span&gt;
                                
                                    &lt;span class=&#34;sf-tag&#34;&gt;#2025年SF周刊&lt;/span&gt;
                                
                            &lt;/div&gt;
                            
                            
                            &lt;h3 class=&#34;sf-title&#34;&gt;「SF周刊」2025年第5期（总第5期）&lt;/h3&gt;
                            
                            
                        &lt;/div&gt;
                    &lt;/a&gt;
                
                    
                    
                    
                    
                    
                    
                        
                    

                    &lt;a href=&#34;https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A2025%E5%B9%B4%E7%AC%AC4%E6%9C%9F%E6%80%BB%E7%AC%AC4%E6%9C%9F/&#34; class=&#34;sf-card&#34; target=&#34;_blank&#34;&gt;
                        &lt;div class=&#34;sf-visual&#34;&gt;
                            
                                &lt;img src=&#34;https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A2025%E5%B9%B4%E7%AC%AC4%E6%9C%9F%E6%80%BB%E7%AC%AC4%E6%9C%9F/20250330-home.jpg&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34; alt=&#34;&#34;&gt;
                            
                        &lt;/div&gt;
                        
                        &lt;div class=&#34;sf-info&#34;&gt;
                            &lt;div class=&#34;sf-meta&#34;&gt;
                                &lt;span class=&#34;sf-date&#34;&gt;2025.03.30&lt;/span&gt;
                                
                                    &lt;span class=&#34;sf-tag&#34;&gt;#2025年SF周刊&lt;/span&gt;
                                
                            &lt;/div&gt;
                            
                            
                            &lt;h3 class=&#34;sf-title&#34;&gt;「SF周刊」2025年第4期（总第4期）&lt;/h3&gt;
                            
                            
                        &lt;/div&gt;
                    &lt;/a&gt;
                
                    
                    
                    
                    
                    
                    
                        
                    

                    &lt;a href=&#34;https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A2025%E5%B9%B4%E7%AC%AC3%E6%9C%9F%E6%80%BB%E7%AC%AC3%E6%9C%9F/&#34; class=&#34;sf-card&#34; target=&#34;_blank&#34;&gt;
                        &lt;div class=&#34;sf-visual&#34;&gt;
                            
                                &lt;img src=&#34;https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A2025%E5%B9%B4%E7%AC%AC3%E6%9C%9F%E6%80%BB%E7%AC%AC3%E6%9C%9F/20250323-home.jpg&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34; alt=&#34;&#34;&gt;
                            
                        &lt;/div&gt;
                        
                        &lt;div class=&#34;sf-info&#34;&gt;
                            &lt;div class=&#34;sf-meta&#34;&gt;
                                &lt;span class=&#34;sf-date&#34;&gt;2025.03.23&lt;/span&gt;
                                
                                    &lt;span class=&#34;sf-tag&#34;&gt;#2025年SF周刊&lt;/span&gt;
                                
                            &lt;/div&gt;
                            
                            
                            &lt;h3 class=&#34;sf-title&#34;&gt;「SF周刊」2025年第3期（总第3期）&lt;/h3&gt;
                            
                            
                        &lt;/div&gt;
                    &lt;/a&gt;
                
                    
                    
                    
                    
                    
                    
                        
                    

                    &lt;a href=&#34;https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A2025%E5%B9%B4%E7%AC%AC2%E6%9C%9F%E6%80%BB%E7%AC%AC2%E6%9C%9F/&#34; class=&#34;sf-card&#34; target=&#34;_blank&#34;&gt;
                        &lt;div class=&#34;sf-visual&#34;&gt;
                            
                                &lt;img src=&#34;https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A2025%E5%B9%B4%E7%AC%AC2%E6%9C%9F%E6%80%BB%E7%AC%AC2%E6%9C%9F/20250315-home.jpg&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34; alt=&#34;&#34;&gt;
                            
                        &lt;/div&gt;
                        
                        &lt;div class=&#34;sf-info&#34;&gt;
                            &lt;div class=&#34;sf-meta&#34;&gt;
                                &lt;span class=&#34;sf-date&#34;&gt;2025.03.15&lt;/span&gt;
                                
                                    &lt;span class=&#34;sf-tag&#34;&gt;#2025年SF周刊&lt;/span&gt;
                                
                            &lt;/div&gt;
                            
                            
                            &lt;h3 class=&#34;sf-title&#34;&gt;「SF周刊」2025年第2期（总第2期）&lt;/h3&gt;
                            
                            
                        &lt;/div&gt;
                    &lt;/a&gt;
                
                    
                    
                    
                    
                    
                    
                        
                    

                    &lt;a href=&#34;https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A2025%E5%B9%B4%E7%AC%AC1%E6%9C%9F%E6%80%BB%E7%AC%AC1%E6%9C%9F/&#34; class=&#34;sf-card&#34; target=&#34;_blank&#34;&gt;
                        &lt;div class=&#34;sf-visual&#34;&gt;
                            
                                &lt;img src=&#34;https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A2025%E5%B9%B4%E7%AC%AC1%E6%9C%9F%E6%80%BB%E7%AC%AC1%E6%9C%9F/20250301-home.jpg&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34; alt=&#34;&#34;&gt;
                            
                        &lt;/div&gt;
                        
                        &lt;div class=&#34;sf-info&#34;&gt;
                            &lt;div class=&#34;sf-meta&#34;&gt;
                                &lt;span class=&#34;sf-date&#34;&gt;2025.03.01&lt;/span&gt;
                                
                                    &lt;span class=&#34;sf-tag&#34;&gt;#2025年SF周刊&lt;/span&gt;
                                
                            &lt;/div&gt;
                            
                            
                            &lt;h3 class=&#34;sf-title&#34;&gt;「SF周刊」2025年第1期（总第1期）&lt;/h3&gt;
                            
                            
                        &lt;/div&gt;
                    &lt;/a&gt;
                
            &lt;/div&gt;
        
    &lt;/div&gt;



&lt;style&gt;
     
    .sf-gallery-large {
        --sf-bg: #ffffff;
        --sf-card-bg: #ffffff;
        --sf-text-main: #111827;  
        --sf-text-sub: #6b7280;
        --sf-accent: #2563eb;
        --sf-border: #e5e7eb;
        --sf-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.02);
        --sf-hover: 0 20px 25px -5px rgba(0, 0, 0, 0.08);
        
        max-width: 1100px;  
        margin: 60px auto;
        font-family: -apple-system, BlinkMacSystemFont, &#34;Segoe UI&#34;, Helvetica, Arial, sans-serif;
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .sf-gallery-large {
            --sf-bg: #0f172a;
            --sf-card-bg: #1e293b;
            --sf-text-main: #f1f5f9;
            --sf-text-sub: #94a3b8;
            --sf-border: #334155;
            --sf-shadow: 0 4px 6px -1px rgba(0,0,0,0.3);
            --sf-hover: 0 20px 25px -5px rgba(0,0,0,0.5);
        }
    }
    html[data-scheme=&#34;dark&#34;] .sf-gallery-large {
        --sf-bg: #0f172a;
        --sf-card-bg: #1e293b;
        --sf-text-main: #f1f5f9;
        --sf-text-sub: #94a3b8;
        --sf-border: #334155;
        --sf-shadow: 0 4px 6px -1px rgba(0,0,0,0.3);
        --sf-hover: 0 20px 25px -5px rgba(0,0,0,0.5);
    }

     
    .sf-year-header {
        display: flex;
        align-items: center;
        gap: 20px;
        margin: 80px 0 40px;
    }
    .sf-year-num {
        font-size: 5rem;  
        font-weight: 900;
        color: var(--sf-border);
        -webkit-text-stroke: 2px var(--sf-text-sub);  
        opacity: 0.3;
        line-height: 0.8;
        letter-spacing: -2px;
    }
    .sf-year-line {
        flex: 1;
        height: 2px;  
        background: var(--sf-border);
    }

     
    .sf-grid {
        display: grid;
        grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));  
        gap: 30px;  
    }

     
    .sf-card {
        display: flex;
        flex-direction: column;
        background: var(--sf-card-bg);
        border: 1px solid var(--sf-border);
        border-radius: 16px;
        overflow: hidden;
        text-decoration: none !important;
        transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
        box-shadow: var(--sf-shadow);
        position: relative;
        height: 100%;
    }

    .sf-card:hover {
        transform: translateY(-8px);  
        box-shadow: var(--sf-hover);
        border-color: var(--sf-accent);
    }

     
    .sf-visual {
        width: 100%;
        aspect-ratio: 16/9;
        background: var(--sf-border);
        position: relative;
        overflow: hidden;
    }
    
    .sf-visual img {
        width: 100%;
        height: 100%;
        object-fit: cover;
        transition: transform 0.6s ease;
        display: block;
    }
    
    .sf-card:hover .sf-visual img {
        transform: scale(1.05);  
    }

     
    .sf-placeholder {
        width: 100%;
        height: 100%;
        display: flex;
        align-items: center;
        justify-content: center;
        font-size: 4rem;  
        font-weight: 900;
        color: var(--sf-border);
        background: linear-gradient(135deg, var(--sf-card-bg) 0%, var(--sf-border) 100%);
    }

     
    .sf-info {
        padding: 25px;  
        display: flex;
        flex-direction: column;
        flex: 1;
        justify-content: space-between;  
    }

    .sf-meta {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 15px;
        font-size: 0.95rem;  
        font-family: monospace;
        color: var(--sf-text-sub);
        font-weight: 500;
    }
    
    .sf-tag {
        color: var(--sf-accent);
        background: rgba(37, 99, 235, 0.1);
        padding: 4px 10px;  
        border-radius: 6px;
        font-weight: 600;
        font-size: 0.85rem;
    }

    .sf-title {
        font-size: 1.6rem;  
        font-weight: 800;
        color: var(--sf-text-main);
        margin: 0;
        line-height: 1.3;
         
        display: -webkit-box;
        -webkit-line-clamp: 3;
        -webkit-box-orient: vertical;
        overflow: hidden;
        letter-spacing: -0.02em;
    }

     
    @media (max-width: 600px) {
        .sf-gallery-large { margin: 30px auto; }
        .sf-grid { grid-template-columns: 1fr; gap: 25px; }
        
         
        .sf-year-num { font-size: 3.5rem; }
        .sf-title { font-size: 1.4rem; }
        .sf-info { padding: 20px; }
    }
&lt;/style&gt;
</description>
        </item>
        <item>
        <title>「工具经验」生产力祛魅 2026：构建一个“本地、稳定、可迁移”的数字堡垒</title>
        <link>https://www.laujoe.top/p/%E5%B7%A5%E5%85%B7%E7%BB%8F%E9%AA%8C%E7%94%9F%E4%BA%A7%E5%8A%9B%E7%A5%9B%E9%AD%85-2026%E6%9E%84%E5%BB%BA%E4%B8%80%E4%B8%AA%E6%9C%AC%E5%9C%B0%E7%A8%B3%E5%AE%9A%E5%8F%AF%E8%BF%81%E7%A7%BB%E7%9A%84%E6%95%B0%E5%AD%97%E5%A0%A1%E5%9E%92/</link>
        <pubDate>Wed, 07 Jan 2026 00:00:00 +0000</pubDate>
        
        <guid>https://www.laujoe.top/p/%E5%B7%A5%E5%85%B7%E7%BB%8F%E9%AA%8C%E7%94%9F%E4%BA%A7%E5%8A%9B%E7%A5%9B%E9%AD%85-2026%E6%9E%84%E5%BB%BA%E4%B8%80%E4%B8%AA%E6%9C%AC%E5%9C%B0%E7%A8%B3%E5%AE%9A%E5%8F%AF%E8%BF%81%E7%A7%BB%E7%9A%84%E6%95%B0%E5%AD%97%E5%A0%A1%E5%9E%92/</guid>
        <description>&lt;img src="https://www.laujoe.top/p/%E5%B7%A5%E5%85%B7%E7%BB%8F%E9%AA%8C%E7%94%9F%E4%BA%A7%E5%8A%9B%E7%A5%9B%E9%AD%85-2026%E6%9E%84%E5%BB%BA%E4%B8%80%E4%B8%AA%E6%9C%AC%E5%9C%B0%E7%A8%B3%E5%AE%9A%E5%8F%AF%E8%BF%81%E7%A7%BB%E7%9A%84%E6%95%B0%E5%AD%97%E5%A0%A1%E5%9E%92/20260107-home.jpg" alt="Featured image of post 「工具经验」生产力祛魅 2026：构建一个“本地、稳定、可迁移”的数字堡垒" /&gt;&lt;h2 id=&#34;前言&#34;&gt;前言
&lt;/h2&gt;&lt;p&gt;时光回溯至2023年，当时我开启了《生产力祛魅》系列的创作。那是一个效率工具大爆发的年代，如Notion等各种时兴工具开始崭露头角，SaaS（软件即服务）模式成为了市场主流。那个系列受到了许多朋友的关注，我们相互交流、探讨，受益颇多。&lt;/p&gt;




 
   













    
    
    

    
        
        
        
        
        
        
            
        

        
        
            
        

        
        
        
        
            
                
                
                
                    
                    
                
            
        
    




    &lt;a href=&#34;https://www.laujoe.top/p/%E5%B7%A5%E5%85%B7%E7%BB%8F%E9%AA%8C-%E7%94%9F%E4%BA%A7%E5%8A%9B%E7%A5%9B%E9%AD%85%E4%B8%80%E4%BD%8D%E7%A4%BE%E7%A7%91%E5%B7%A5%E4%BD%9C%E8%80%85%E5%A6%82%E4%BD%95%E9%87%8D%E5%A1%91%E5%B7%A5%E4%BD%9C%E6%B5%81-%E7%AC%AC%E4%B8%80%E8%8A%82%E6%80%BB%E8%A7%88/&#34; class=&#34;qsl-card&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;
        &lt;div class=&#34;qsl-visual&#34;&gt;
            
                &lt;img src=&#34;https://www.laujoe.top/p/%E5%B7%A5%E5%85%B7%E7%BB%8F%E9%AA%8C-%E7%94%9F%E4%BA%A7%E5%8A%9B%E7%A5%9B%E9%AD%85%E4%B8%80%E4%BD%8D%E7%A4%BE%E7%A7%91%E5%B7%A5%E4%BD%9C%E8%80%85%E5%A6%82%E4%BD%95%E9%87%8D%E5%A1%91%E5%B7%A5%E4%BD%9C%E6%B5%81-%E7%AC%AC%E4%B8%80%E8%8A%82%E6%80%BB%E8%A7%88/20230219-home_hu_58fb475536fa8a37.webp&#34; alt=&#34;「工具经验-生产力祛魅」——一位社科工作者如何重塑工作流 第一节：总览&#34; class=&#34;qsl-image&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
            
        &lt;/div&gt;

        &lt;div class=&#34;qsl-content&#34;&gt;
            &lt;div class=&#34;qsl-meta&#34;&gt;
                &lt;span class=&#34;qsl-badge&#34;&gt;关联阅读&lt;/span&gt;
                
                &lt;span class=&#34;qsl-date&#34;&gt;2023.02.19&lt;/span&gt;
                
            &lt;/div&gt;
            
            &lt;h4 class=&#34;qsl-title&#34;&gt;
                「工具经验-生产力祛魅」——一位社科工作者如何重塑工作流 第一节：总览
            &lt;/h4&gt;
            
            &lt;div class=&#34;qsl-summary&#34;&gt;
                第一篇文章，我将对目前所完善的工作流进行介绍，而后面的文章则针对不同的工作流阐述我个人的心得与技巧。
            &lt;/div&gt;
            
            &lt;span class=&#34;qsl-arrow&#34;&gt;
                阅读全文 &amp;rarr;
            &lt;/span&gt;
        &lt;/div&gt;
    &lt;/a&gt;



&lt;style&gt;
     
    .qsl-card {
         
        --qsl-bg-card: #ffffff;
        --qsl-bg-visual: #f8f9fa;
        
        --qsl-border: rgba(0,0,0,0.08);
        --qsl-border-visual: rgba(0,0,0,0.04);
        
        --qsl-shadow: 0 4px 6px rgba(0,0,0,0.02);
        --qsl-shadow-hover: 0 12px 25px rgba(0,0,0,0.08);
        
        --qsl-text-title: #2d3748;
        --qsl-text-summary: #718096;
        --qsl-text-date: #999999;
        
        --qsl-icon-color: #cbd5e0;
        
        --qsl-badge-bg: rgba(58, 123, 213, 0.1);
        --qsl-badge-text: #3a7bd5;
        
        --qsl-highlight: #3a7bd5;

        display: flex;
        align-items: stretch;
        background: var(--qsl-bg-card);
        border: 1px solid var(--qsl-border);
        border-radius: 12px;
        text-decoration: none !important;
        margin: 2rem 0;
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, border-color 0.2s, background 0.3s;
        font-family: inherit;
        box-shadow: var(--qsl-shadow);
        color: inherit;
        height: 160px;  
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .qsl-card {
            --qsl-bg-card: #1e1e1e;
            --qsl-bg-visual: #252525;
            
            --qsl-border: #333333;
            --qsl-border-visual: #333333;
            
            --qsl-shadow: 0 4px 6px rgba(0,0,0,0.2);
            --qsl-shadow-hover: 0 12px 25px rgba(0,0,0,0.4);
            
            --qsl-text-title: #f0f0f0;
            --qsl-text-summary: #a0aec0;
            --qsl-text-date: #888888;
            
            --qsl-icon-color: #555555;
            
            --qsl-badge-bg: rgba(99, 179, 237, 0.15);
            --qsl-badge-text: #63b3ed;
            
            --qsl-highlight: #63b3ed;
        }
    }

    html[data-scheme=&#34;dark&#34;] .qsl-card {
        --qsl-bg-card: #1e1e1e;
        --qsl-bg-visual: #252525;
        
        --qsl-border: #333333;
        --qsl-border-visual: #333333;
        
        --qsl-shadow: 0 4px 6px rgba(0,0,0,0.2);
        --qsl-shadow-hover: 0 12px 25px rgba(0,0,0,0.4);
        
        --qsl-text-title: #f0f0f0;
        --qsl-text-summary: #a0aec0;
        --qsl-text-date: #888888;
        
        --qsl-icon-color: #555555;
        
        --qsl-badge-bg: rgba(99, 179, 237, 0.15);
        --qsl-badge-text: #63b3ed;
        
        --qsl-highlight: #63b3ed;
    }

    .qsl-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--qsl-shadow-hover);
        border-color: var(--qsl-highlight);
    }

    .qsl-visual {
        width: 140px; 
        flex-shrink: 0;
        background: var(--qsl-bg-visual);
        display: flex;
        align-items: center;
        justify-content: center;
        border-right: 1px solid var(--qsl-border-visual);
        position: relative;
        overflow: hidden;
        transition: background 0.3s, border-color 0.3s;
    }

    .qsl-image {
        width: 100%;
        height: 100%;
        object-fit: cover;
        transition: transform 0.5s ease;
    }
    .qsl-card:hover .qsl-image { transform: scale(1.05); }

    .qsl-icon-box { color: var(--qsl-icon-color); transition: color 0.3s; }
    .qsl-card:hover .qsl-icon-box { color: var(--qsl-highlight); }
    .qsl-icon-box svg { width: 40px; height: 40px; }

    .qsl-content {
        padding: 16px 20px;
        flex: 1;
        display: flex;
        flex-direction: column;
        justify-content: space-between; 
        min-width: 0;
    }

    .qsl-meta {
        display: flex;
        align-items: center;
        gap: 10px;
        font-size: 12px;
    }

    .qsl-badge {
        background: var(--qsl-badge-bg);
        color: var(--qsl-badge-text);
        padding: 2px 8px;
        border-radius: 4px;
        font-weight: 700;
        text-transform: uppercase;
        font-size: 1.1rem;
        transition: background 0.3s, color 0.3s;
    }

    .qsl-date { color: var(--qsl-text-date); transition: color 0.3s; }

    .qsl-title {
        margin: 0;
        font-size: 1.4rem;
        font-weight: 700;
        color: var(--qsl-text-title);
        line-height: 1.4;
        display: -webkit-box;
        -webkit-line-clamp: 2; 
        -webkit-box-orient: vertical;
        overflow: hidden;
        transition: color 0.3s;
    }
    .qsl-card:hover .qsl-title { color: var(--qsl-highlight); }

    .qsl-summary {
        font-size: 1.3rem;
        color: var(--qsl-text-summary);
        line-height: 1.5;
        display: -webkit-box;
        -webkit-line-clamp: 2; 
        -webkit-box-orient: vertical;
        overflow: hidden;
        transition: color 0.3s;
    }

    .qsl-arrow {
        font-size: 12px;
        font-weight: 600;
        color: var(--qsl-highlight);
        opacity: 0;
        transform: translateX(-10px);
        transition: all 0.2s ease;
        margin-top: auto; 
    }
    .qsl-card:hover .qsl-arrow {
        opacity: 1;
        transform: translateX(0);
    }

    @media (max-width: 600px) {
        .qsl-card { flex-direction: column; height: auto; }
        .qsl-visual { width: 100%; height: 140px; border-right: none; border-bottom: 1px solid var(--qsl-border-visual); }
        .qsl-content { padding: 15px; gap: 10px; }
        .qsl-arrow { opacity: 1; transform: none; display: block; margin-top: 5px; }
    }
&lt;/style&gt;
&lt;p&gt;转眼来到2026年，时隔差不多3年时间。我回看在《生产力祛魅》中提出的论断，发现它们不仅没有过时，反而愈来愈重要。&lt;/p&gt;
&lt;p&gt;在目前这个AI「横行」的年代，一套能够持续运行、真正服务于人的生产力工作流，必须要死守这三个严苛的条件：&lt;/p&gt;
&lt;p&gt;本地化（Local-First）： 数据必须物理地存在于我的硬盘上。任何必须联网才能打开、必须登录才能查看数据的工具，都不能作为核心生产力工具，只能作为临时管道。&lt;/p&gt;
&lt;p&gt;稳定性（Stability）： 绝对不将云软件作为主要工具，工具应当像锤子和扳手一样，十年如一日地保持其功能预期。&lt;/p&gt;
&lt;p&gt;可迁移性（Transferability）： 数据必须是通用的格式（Markdown、PDF、纯文本等）。&lt;/p&gt;
&lt;p&gt;虽然核心论据未变，但随着技术的迭代（尤其是 Docker 容器化技术的普及和本地 AI 模型的轻量化），我所利用的软件还是有所变化。&lt;/p&gt;
&lt;p&gt;因此，我想借这篇文章，以一个在读硕士研究生 / 文字工作者的视角，剥离掉协作功能（如 n8n 自动化流、团队协作 IDE 等），单纯地谈谈：一个人，一台电脑，如何构建一个不依赖外界、坚不可摧的「数字作坊」。从某种角度来说，我的「本地工作流」更像是一个纯粹的个人文字工作者如何安排、布置自己的「全天工作」。&lt;/p&gt;
&lt;h2 id=&#34;办公工作流&#34;&gt;办公工作流
&lt;/h2&gt;&lt;p&gt;在我的数字版图中，「办公」并非指在公司上班，而是指维持我个人数字生活正常运转的基础设施，这包括了网页浏览、数据存储、云盘软件等。虽然我的软件不少，但大多数都不会打开。真正作为「入口」和「中枢」的，依然是那些具有强大的「集聚」效应的工具。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://www.laujoe.top/p/%E5%B7%A5%E5%85%B7%E7%BB%8F%E9%AA%8C%E7%94%9F%E4%BA%A7%E5%8A%9B%E7%A5%9B%E9%AD%85-2026%E6%9E%84%E5%BB%BA%E4%B8%80%E4%B8%AA%E6%9C%AC%E5%9C%B0%E7%A8%B3%E5%AE%9A%E5%8F%AF%E8%BF%81%E7%A7%BB%E7%9A%84%E6%95%B0%E5%AD%97%E5%A0%A1%E5%9E%92/20260107-Picture01.jpg&#34;
	width=&#34;2640&#34;
	height=&#34;1482&#34;
	srcset=&#34;https://www.laujoe.top/p/%E5%B7%A5%E5%85%B7%E7%BB%8F%E9%AA%8C%E7%94%9F%E4%BA%A7%E5%8A%9B%E7%A5%9B%E9%AD%85-2026%E6%9E%84%E5%BB%BA%E4%B8%80%E4%B8%AA%E6%9C%AC%E5%9C%B0%E7%A8%B3%E5%AE%9A%E5%8F%AF%E8%BF%81%E7%A7%BB%E7%9A%84%E6%95%B0%E5%AD%97%E5%A0%A1%E5%9E%92/20260107-Picture01_hu_b6b957d22f111c79.jpg 480w, https://www.laujoe.top/p/%E5%B7%A5%E5%85%B7%E7%BB%8F%E9%AA%8C%E7%94%9F%E4%BA%A7%E5%8A%9B%E7%A5%9B%E9%AD%85-2026%E6%9E%84%E5%BB%BA%E4%B8%80%E4%B8%AA%E6%9C%AC%E5%9C%B0%E7%A8%B3%E5%AE%9A%E5%8F%AF%E8%BF%81%E7%A7%BB%E7%9A%84%E6%95%B0%E5%AD%97%E5%A0%A1%E5%9E%92/20260107-Picture01_hu_33ba5e8a81a9d44b.jpg 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;办公/日常/云盘软件(1)&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;178&#34;
		data-flex-basis=&#34;427px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://www.laujoe.top/p/%E5%B7%A5%E5%85%B7%E7%BB%8F%E9%AA%8C%E7%94%9F%E4%BA%A7%E5%8A%9B%E7%A5%9B%E9%AD%85-2026%E6%9E%84%E5%BB%BA%E4%B8%80%E4%B8%AA%E6%9C%AC%E5%9C%B0%E7%A8%B3%E5%AE%9A%E5%8F%AF%E8%BF%81%E7%A7%BB%E7%9A%84%E6%95%B0%E5%AD%97%E5%A0%A1%E5%9E%92/20260107-Picture02.jpg&#34;
	width=&#34;2650&#34;
	height=&#34;1492&#34;
	srcset=&#34;https://www.laujoe.top/p/%E5%B7%A5%E5%85%B7%E7%BB%8F%E9%AA%8C%E7%94%9F%E4%BA%A7%E5%8A%9B%E7%A5%9B%E9%AD%85-2026%E6%9E%84%E5%BB%BA%E4%B8%80%E4%B8%AA%E6%9C%AC%E5%9C%B0%E7%A8%B3%E5%AE%9A%E5%8F%AF%E8%BF%81%E7%A7%BB%E7%9A%84%E6%95%B0%E5%AD%97%E5%A0%A1%E5%9E%92/20260107-Picture02_hu_c102117fff468da1.jpg 480w, https://www.laujoe.top/p/%E5%B7%A5%E5%85%B7%E7%BB%8F%E9%AA%8C%E7%94%9F%E4%BA%A7%E5%8A%9B%E7%A5%9B%E9%AD%85-2026%E6%9E%84%E5%BB%BA%E4%B8%80%E4%B8%AA%E6%9C%AC%E5%9C%B0%E7%A8%B3%E5%AE%9A%E5%8F%AF%E8%BF%81%E7%A7%BB%E7%9A%84%E6%95%B0%E5%AD%97%E5%A0%A1%E5%9E%92/20260107-Picture02_hu_bc1cbe26a7d7de11.jpg 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;办公/日常/云盘软件(2)&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;177&#34;
		data-flex-basis=&#34;426px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;在图1和图2中展示的众多软件里，Devonthink是绝对的核心。它是一个本地文件管理器，Devonthink原本支持OCR，我可以将各种文件放进去，尤其是在处理大量非结构化数据（如古籍扫描件、学术论文PDF、网页存档）时，它会将其OCR，我可以搜索所有文件及其文本。这种无需联网的本地化智能，保障了研究的隐私性与连贯性。See Also、Graph等功能则为文件、文本之间的联系进行了更为直观地展示。&lt;/p&gt;
&lt;p&gt;我的浏览器软件很多，但是主力是Arc浏览器，Chrome、Edge、Safari等主要是以备不时之需。Arc浏览器的工作区（Spaces）功能，让我感觉很舒服。我可以建立学术、日常、娱乐等不同的工作区，让我能够更加专注于特定事物。&lt;/p&gt;
&lt;p&gt;我原来的主力是Chrome，因为其中有许多书签，我一直没有找到很好的替代品。Arc并不太能够支持大量书签的处理，这使我陷入了进退维谷的境地。后来我发现&lt;a class=&#34;link&#34; href=&#34;https://github.com/helloxz/onenav&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;OneNav&lt;/a&gt;项目，通过用Docker搭建OneNav，然后将所有书签都导入进去，构建了一个独立的、标准化的导航索引库，将书签数据从浏览器端剥离。不论我使用何种浏览器，都可以应用这套导航索引库。分门别类，十分方便。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://www.laujoe.top/p/%E5%B7%A5%E5%85%B7%E7%BB%8F%E9%AA%8C%E7%94%9F%E4%BA%A7%E5%8A%9B%E7%A5%9B%E9%AD%85-2026%E6%9E%84%E5%BB%BA%E4%B8%80%E4%B8%AA%E6%9C%AC%E5%9C%B0%E7%A8%B3%E5%AE%9A%E5%8F%AF%E8%BF%81%E7%A7%BB%E7%9A%84%E6%95%B0%E5%AD%97%E5%A0%A1%E5%9E%92/20260107-Picture03.jpg&#34;
	width=&#34;2604&#34;
	height=&#34;1728&#34;
	srcset=&#34;https://www.laujoe.top/p/%E5%B7%A5%E5%85%B7%E7%BB%8F%E9%AA%8C%E7%94%9F%E4%BA%A7%E5%8A%9B%E7%A5%9B%E9%AD%85-2026%E6%9E%84%E5%BB%BA%E4%B8%80%E4%B8%AA%E6%9C%AC%E5%9C%B0%E7%A8%B3%E5%AE%9A%E5%8F%AF%E8%BF%81%E7%A7%BB%E7%9A%84%E6%95%B0%E5%AD%97%E5%A0%A1%E5%9E%92/20260107-Picture03_hu_af459b1cc74c7b56.jpg 480w, https://www.laujoe.top/p/%E5%B7%A5%E5%85%B7%E7%BB%8F%E9%AA%8C%E7%94%9F%E4%BA%A7%E5%8A%9B%E7%A5%9B%E9%AD%85-2026%E6%9E%84%E5%BB%BA%E4%B8%80%E4%B8%AA%E6%9C%AC%E5%9C%B0%E7%A8%B3%E5%AE%9A%E5%8F%AF%E8%BF%81%E7%A7%BB%E7%9A%84%E6%95%B0%E5%AD%97%E5%A0%A1%E5%9E%92/20260107-Picture03_hu_2bec5fc6b708ff5b.jpg 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;OneNav 展示（1）&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;150&#34;
		data-flex-basis=&#34;361px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://www.laujoe.top/p/%E5%B7%A5%E5%85%B7%E7%BB%8F%E9%AA%8C%E7%94%9F%E4%BA%A7%E5%8A%9B%E7%A5%9B%E9%AD%85-2026%E6%9E%84%E5%BB%BA%E4%B8%80%E4%B8%AA%E6%9C%AC%E5%9C%B0%E7%A8%B3%E5%AE%9A%E5%8F%AF%E8%BF%81%E7%A7%BB%E7%9A%84%E6%95%B0%E5%AD%97%E5%A0%A1%E5%9E%92/20260107-Picture04.jpg&#34;
	width=&#34;2606&#34;
	height=&#34;1700&#34;
	srcset=&#34;https://www.laujoe.top/p/%E5%B7%A5%E5%85%B7%E7%BB%8F%E9%AA%8C%E7%94%9F%E4%BA%A7%E5%8A%9B%E7%A5%9B%E9%AD%85-2026%E6%9E%84%E5%BB%BA%E4%B8%80%E4%B8%AA%E6%9C%AC%E5%9C%B0%E7%A8%B3%E5%AE%9A%E5%8F%AF%E8%BF%81%E7%A7%BB%E7%9A%84%E6%95%B0%E5%AD%97%E5%A0%A1%E5%9E%92/20260107-Picture04_hu_391d6f0b5a52a535.jpg 480w, https://www.laujoe.top/p/%E5%B7%A5%E5%85%B7%E7%BB%8F%E9%AA%8C%E7%94%9F%E4%BA%A7%E5%8A%9B%E7%A5%9B%E9%AD%85-2026%E6%9E%84%E5%BB%BA%E4%B8%80%E4%B8%AA%E6%9C%AC%E5%9C%B0%E7%A8%B3%E5%AE%9A%E5%8F%AF%E8%BF%81%E7%A7%BB%E7%9A%84%E6%95%B0%E5%AD%97%E5%A0%A1%E5%9E%92/20260107-Picture04_hu_bf6d85ba42659ff6.jpg 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;OneNav 展示（2）&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;153&#34;
		data-flex-basis=&#34;367px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;如图所示，虽然我有很多邮箱软件，但是我日常只用Thunderbird。&lt;/p&gt;
&lt;p&gt;Thunderbird的优势在于对POP3、IMAP、SMTP等各种标准协议的遵循，以及丰富且透明的插件生态，其中有许多好用的插件（例如邮件流）。我将分散于Google、Microsoft Outlook、腾讯、网易等服务商的邮件都汇聚在Thunderbird，其本地数据库能够永久保存我的通讯记录。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://www.laujoe.top/p/%E5%B7%A5%E5%85%B7%E7%BB%8F%E9%AA%8C%E7%94%9F%E4%BA%A7%E5%8A%9B%E7%A5%9B%E9%AD%85-2026%E6%9E%84%E5%BB%BA%E4%B8%80%E4%B8%AA%E6%9C%AC%E5%9C%B0%E7%A8%B3%E5%AE%9A%E5%8F%AF%E8%BF%81%E7%A7%BB%E7%9A%84%E6%95%B0%E5%AD%97%E5%A0%A1%E5%9E%92/20260107-Picture05.jpg&#34;
	width=&#34;2590&#34;
	height=&#34;1494&#34;
	srcset=&#34;https://www.laujoe.top/p/%E5%B7%A5%E5%85%B7%E7%BB%8F%E9%AA%8C%E7%94%9F%E4%BA%A7%E5%8A%9B%E7%A5%9B%E9%AD%85-2026%E6%9E%84%E5%BB%BA%E4%B8%80%E4%B8%AA%E6%9C%AC%E5%9C%B0%E7%A8%B3%E5%AE%9A%E5%8F%AF%E8%BF%81%E7%A7%BB%E7%9A%84%E6%95%B0%E5%AD%97%E5%A0%A1%E5%9E%92/20260107-Picture05_hu_12a3dddc04f70f8c.jpg 480w, https://www.laujoe.top/p/%E5%B7%A5%E5%85%B7%E7%BB%8F%E9%AA%8C%E7%94%9F%E4%BA%A7%E5%8A%9B%E7%A5%9B%E9%AD%85-2026%E6%9E%84%E5%BB%BA%E4%B8%80%E4%B8%AA%E6%9C%AC%E5%9C%B0%E7%A8%B3%E5%AE%9A%E5%8F%AF%E8%BF%81%E7%A7%BB%E7%9A%84%E6%95%B0%E5%AD%97%E5%A0%A1%E5%9E%92/20260107-Picture05_hu_5136a5256271915f.jpg 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;Thunderbird 展示&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;173&#34;
		data-flex-basis=&#34;416px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;至于Microsoft Office 365、云盘等软件，在此不过多赘述。值得分享的是OmniFocus，其实有许多朋友都分享、介绍过这款软件。在我看来，我不会用很花里胡哨的方式去使用它。我将它视作加强版本的日历软件，例如如图所示的「每周计划」、「专业活动」等。「每周计划」是我每周要提醒自己做的事情，每天早上起来略览一遍，便清楚一周的计划。「专业活动」则是与学术会议等学术活动有关系，例如我何时投稿了某个学术会议，包括其后续情况等。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://www.laujoe.top/p/%E5%B7%A5%E5%85%B7%E7%BB%8F%E9%AA%8C%E7%94%9F%E4%BA%A7%E5%8A%9B%E7%A5%9B%E9%AD%85-2026%E6%9E%84%E5%BB%BA%E4%B8%80%E4%B8%AA%E6%9C%AC%E5%9C%B0%E7%A8%B3%E5%AE%9A%E5%8F%AF%E8%BF%81%E7%A7%BB%E7%9A%84%E6%95%B0%E5%AD%97%E5%A0%A1%E5%9E%92/20260107-Picture06.jpg&#34;
	width=&#34;2126&#34;
	height=&#34;1416&#34;
	srcset=&#34;https://www.laujoe.top/p/%E5%B7%A5%E5%85%B7%E7%BB%8F%E9%AA%8C%E7%94%9F%E4%BA%A7%E5%8A%9B%E7%A5%9B%E9%AD%85-2026%E6%9E%84%E5%BB%BA%E4%B8%80%E4%B8%AA%E6%9C%AC%E5%9C%B0%E7%A8%B3%E5%AE%9A%E5%8F%AF%E8%BF%81%E7%A7%BB%E7%9A%84%E6%95%B0%E5%AD%97%E5%A0%A1%E5%9E%92/20260107-Picture06_hu_c2e466b2fae6874a.jpg 480w, https://www.laujoe.top/p/%E5%B7%A5%E5%85%B7%E7%BB%8F%E9%AA%8C%E7%94%9F%E4%BA%A7%E5%8A%9B%E7%A5%9B%E9%AD%85-2026%E6%9E%84%E5%BB%BA%E4%B8%80%E4%B8%AA%E6%9C%AC%E5%9C%B0%E7%A8%B3%E5%AE%9A%E5%8F%AF%E8%BF%81%E7%A7%BB%E7%9A%84%E6%95%B0%E5%AD%97%E5%A0%A1%E5%9E%92/20260107-Picture06_hu_3480f1d502a74d5.jpg 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;OmniFocus 展示&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;150&#34;
		data-flex-basis=&#34;360px&#34;
	
&gt;&lt;/p&gt;
&lt;h2 id=&#34;信息工作流&#34;&gt;信息工作流
&lt;/h2&gt;&lt;p&gt;第二个工作流是信息工作流。过去的一年，我经常推荐Follow（Folo）这款软件，认为它是目前最适合RSS阅读的软件。但是在2025年10月左右，Folo开始收费。&lt;/p&gt;
&lt;p&gt;其实我很理解软件收费，也愿意付费，然而Folo较为高昂的订阅制收费确实令我望而却步。结合Folo那时候的更新并不符合我的审美取向，对原来签到虚拟币的弃置等诸多原因，我还是放弃使用Folo，转而继续使用Reeder，并且自行搭建Rsshub。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://www.laujoe.top/p/%E5%B7%A5%E5%85%B7%E7%BB%8F%E9%AA%8C%E7%94%9F%E4%BA%A7%E5%8A%9B%E7%A5%9B%E9%AD%85-2026%E6%9E%84%E5%BB%BA%E4%B8%80%E4%B8%AA%E6%9C%AC%E5%9C%B0%E7%A8%B3%E5%AE%9A%E5%8F%AF%E8%BF%81%E7%A7%BB%E7%9A%84%E6%95%B0%E5%AD%97%E5%A0%A1%E5%9E%92/20260107-Picture07.jpg&#34;
	width=&#34;3022&#34;
	height=&#34;1748&#34;
	srcset=&#34;https://www.laujoe.top/p/%E5%B7%A5%E5%85%B7%E7%BB%8F%E9%AA%8C%E7%94%9F%E4%BA%A7%E5%8A%9B%E7%A5%9B%E9%AD%85-2026%E6%9E%84%E5%BB%BA%E4%B8%80%E4%B8%AA%E6%9C%AC%E5%9C%B0%E7%A8%B3%E5%AE%9A%E5%8F%AF%E8%BF%81%E7%A7%BB%E7%9A%84%E6%95%B0%E5%AD%97%E5%A0%A1%E5%9E%92/20260107-Picture07_hu_6263fbc44aeac0e8.jpg 480w, https://www.laujoe.top/p/%E5%B7%A5%E5%85%B7%E7%BB%8F%E9%AA%8C%E7%94%9F%E4%BA%A7%E5%8A%9B%E7%A5%9B%E9%AD%85-2026%E6%9E%84%E5%BB%BA%E4%B8%80%E4%B8%AA%E6%9C%AC%E5%9C%B0%E7%A8%B3%E5%AE%9A%E5%8F%AF%E8%BF%81%E7%A7%BB%E7%9A%84%E6%95%B0%E5%AD%97%E5%A0%A1%E5%9E%92/20260107-Picture07_hu_656416dcb08c7f18.jpg 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;Reeder 展示(1)&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;172&#34;
		data-flex-basis=&#34;414px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://www.laujoe.top/p/%E5%B7%A5%E5%85%B7%E7%BB%8F%E9%AA%8C%E7%94%9F%E4%BA%A7%E5%8A%9B%E7%A5%9B%E9%AD%85-2026%E6%9E%84%E5%BB%BA%E4%B8%80%E4%B8%AA%E6%9C%AC%E5%9C%B0%E7%A8%B3%E5%AE%9A%E5%8F%AF%E8%BF%81%E7%A7%BB%E7%9A%84%E6%95%B0%E5%AD%97%E5%A0%A1%E5%9E%92/20260107-Picture08.jpg&#34;
	width=&#34;3022&#34;
	height=&#34;1748&#34;
	srcset=&#34;https://www.laujoe.top/p/%E5%B7%A5%E5%85%B7%E7%BB%8F%E9%AA%8C%E7%94%9F%E4%BA%A7%E5%8A%9B%E7%A5%9B%E9%AD%85-2026%E6%9E%84%E5%BB%BA%E4%B8%80%E4%B8%AA%E6%9C%AC%E5%9C%B0%E7%A8%B3%E5%AE%9A%E5%8F%AF%E8%BF%81%E7%A7%BB%E7%9A%84%E6%95%B0%E5%AD%97%E5%A0%A1%E5%9E%92/20260107-Picture08_hu_8c96d4d898181bc9.jpg 480w, https://www.laujoe.top/p/%E5%B7%A5%E5%85%B7%E7%BB%8F%E9%AA%8C%E7%94%9F%E4%BA%A7%E5%8A%9B%E7%A5%9B%E9%AD%85-2026%E6%9E%84%E5%BB%BA%E4%B8%80%E4%B8%AA%E6%9C%AC%E5%9C%B0%E7%A8%B3%E5%AE%9A%E5%8F%AF%E8%BF%81%E7%A7%BB%E7%9A%84%E6%95%B0%E5%AD%97%E5%A0%A1%E5%9E%92/20260107-Picture08_hu_bb1dc2971c3e756d.jpg 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;Reeder 展示(2)&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;172&#34;
		data-flex-basis=&#34;414px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;从BiLi、Youtube等视频网站，再到电报、豆瓣、X等平台资讯，以及学术方面的CNKI期刊等，搭建Rsshub的Reeder都能够支持。虽然没有AI翻译等功能，但是已经能够满足我的需要。&lt;/p&gt;
&lt;p&gt;除Reeder，我还搭建了&lt;a class=&#34;link&#34; href=&#34;https://github.com/ourongxing/newsnow&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;newsnow&lt;/a&gt;作为重要的新闻资讯来源。newsnow是Github上的开源项目，很方便就可以用Docker进行本地搭建。该软件能够以高密度的文本看板形式呈现全球资讯，很方便我在碎片化时间进行快速浏览，&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://www.laujoe.top/p/%E5%B7%A5%E5%85%B7%E7%BB%8F%E9%AA%8C%E7%94%9F%E4%BA%A7%E5%8A%9B%E7%A5%9B%E9%AD%85-2026%E6%9E%84%E5%BB%BA%E4%B8%80%E4%B8%AA%E6%9C%AC%E5%9C%B0%E7%A8%B3%E5%AE%9A%E5%8F%AF%E8%BF%81%E7%A7%BB%E7%9A%84%E6%95%B0%E5%AD%97%E5%A0%A1%E5%9E%92/20260107-Picture09.jpg&#34;
	width=&#34;2566&#34;
	height=&#34;1724&#34;
	srcset=&#34;https://www.laujoe.top/p/%E5%B7%A5%E5%85%B7%E7%BB%8F%E9%AA%8C%E7%94%9F%E4%BA%A7%E5%8A%9B%E7%A5%9B%E9%AD%85-2026%E6%9E%84%E5%BB%BA%E4%B8%80%E4%B8%AA%E6%9C%AC%E5%9C%B0%E7%A8%B3%E5%AE%9A%E5%8F%AF%E8%BF%81%E7%A7%BB%E7%9A%84%E6%95%B0%E5%AD%97%E5%A0%A1%E5%9E%92/20260107-Picture09_hu_dc141f302d4d4693.jpg 480w, https://www.laujoe.top/p/%E5%B7%A5%E5%85%B7%E7%BB%8F%E9%AA%8C%E7%94%9F%E4%BA%A7%E5%8A%9B%E7%A5%9B%E9%AD%85-2026%E6%9E%84%E5%BB%BA%E4%B8%80%E4%B8%AA%E6%9C%AC%E5%9C%B0%E7%A8%B3%E5%AE%9A%E5%8F%AF%E8%BF%81%E7%A7%BB%E7%9A%84%E6%95%B0%E5%AD%97%E5%A0%A1%E5%9E%92/20260107-Picture09_hu_4afdc95bc82904b4.jpg 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;newsnow 展示&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;148&#34;
		data-flex-basis=&#34;357px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;关于信息的收纳与整理，我个人的见解是：除非必要，否则不用在意，注意断舍离。之前我还经常将所看到的、颇为重要的信息以PDF形式进行保存。随着时间的流逝，我发现这毫无意义。有些朋友认为可以用AI工具辅助信息的收纳与整理，确实如此，但关键处在于要收纳与整理「重要信息」，而非全盘吸收，否则会被大量的信息「摧残」，进而不堪其扰，陷入摆烂状态。对此，其实我个人的观点是：对于重要信息（学业、职业、商业等各种相关），专门建立相应的笔记文件夹，并且要写日记，记录自己的感受感想。以此为基础，可以利用AI大模型等进行处理，建构个人的知识库。除此，其余信息均无记录必要。&lt;/p&gt;
&lt;h2 id=&#34;生产工作流&#34;&gt;生产工作流
&lt;/h2&gt;&lt;p&gt;之后是涉及到阅读、创作、研究等流程的生产工作流。Anytype这一软件我曾撰写专文进行介绍，它主要用来记录我所投稿的期刊，里面记录着期刊的各种信息，辅助我进行投稿等。不同于传统笔记软件的文档逻辑，Anytype允许用户自定义「对象类型」。例如我创建了「期刊」模板，里面包含影响因子、期刊级别、审稿周期等各种类型。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://www.laujoe.top/p/%E5%B7%A5%E5%85%B7%E7%BB%8F%E9%AA%8C%E7%94%9F%E4%BA%A7%E5%8A%9B%E7%A5%9B%E9%AD%85-2026%E6%9E%84%E5%BB%BA%E4%B8%80%E4%B8%AA%E6%9C%AC%E5%9C%B0%E7%A8%B3%E5%AE%9A%E5%8F%AF%E8%BF%81%E7%A7%BB%E7%9A%84%E6%95%B0%E5%AD%97%E5%A0%A1%E5%9E%92/20260107-Picture10.jpg&#34;
	width=&#34;2642&#34;
	height=&#34;1414&#34;
	srcset=&#34;https://www.laujoe.top/p/%E5%B7%A5%E5%85%B7%E7%BB%8F%E9%AA%8C%E7%94%9F%E4%BA%A7%E5%8A%9B%E7%A5%9B%E9%AD%85-2026%E6%9E%84%E5%BB%BA%E4%B8%80%E4%B8%AA%E6%9C%AC%E5%9C%B0%E7%A8%B3%E5%AE%9A%E5%8F%AF%E8%BF%81%E7%A7%BB%E7%9A%84%E6%95%B0%E5%AD%97%E5%A0%A1%E5%9E%92/20260107-Picture10_hu_788e8bd54ae40f15.jpg 480w, https://www.laujoe.top/p/%E5%B7%A5%E5%85%B7%E7%BB%8F%E9%AA%8C%E7%94%9F%E4%BA%A7%E5%8A%9B%E7%A5%9B%E9%AD%85-2026%E6%9E%84%E5%BB%BA%E4%B8%80%E4%B8%AA%E6%9C%AC%E5%9C%B0%E7%A8%B3%E5%AE%9A%E5%8F%AF%E8%BF%81%E7%A7%BB%E7%9A%84%E6%95%B0%E5%AD%97%E5%A0%A1%E5%9E%92/20260107-Picture10_hu_75bf9dd5bc517e22.jpg 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;阅读/创作/研究软件&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;186&#34;
		data-flex-basis=&#34;448px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;以Acrobat为代表的阅读类软件，则是根据场景、用途的差异进行使用。&lt;/p&gt;
&lt;p&gt;Endnote、Scrivener、Tropy是我的三大主力创作工具，构成了我重要的学术知识生产工作流。我所有的写作都是以「项目」作为基准，然后在Devonthink内进行归档。接下来，我将详细介绍这个流程：&lt;/p&gt;
&lt;p&gt;当我想要写作某篇文章时，我会用Scrivener建立一个新项目。Scrivener内置各种形式的模板，并且支持各种形式的资料导入。Scrivener的「活页夹」逻辑允许将长篇文章拆解为独立的文本块，支持非线性的跳跃式写作，对学位论文等长篇文章写作有很好的支持效果。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://www.laujoe.top/p/%E5%B7%A5%E5%85%B7%E7%BB%8F%E9%AA%8C%E7%94%9F%E4%BA%A7%E5%8A%9B%E7%A5%9B%E9%AD%85-2026%E6%9E%84%E5%BB%BA%E4%B8%80%E4%B8%AA%E6%9C%AC%E5%9C%B0%E7%A8%B3%E5%AE%9A%E5%8F%AF%E8%BF%81%E7%A7%BB%E7%9A%84%E6%95%B0%E5%AD%97%E5%A0%A1%E5%9E%92/20260107-Picture11.jpg&#34;
	width=&#34;1400&#34;
	height=&#34;1146&#34;
	srcset=&#34;https://www.laujoe.top/p/%E5%B7%A5%E5%85%B7%E7%BB%8F%E9%AA%8C%E7%94%9F%E4%BA%A7%E5%8A%9B%E7%A5%9B%E9%AD%85-2026%E6%9E%84%E5%BB%BA%E4%B8%80%E4%B8%AA%E6%9C%AC%E5%9C%B0%E7%A8%B3%E5%AE%9A%E5%8F%AF%E8%BF%81%E7%A7%BB%E7%9A%84%E6%95%B0%E5%AD%97%E5%A0%A1%E5%9E%92/20260107-Picture11_hu_a5041da63e2bf126.jpg 480w, https://www.laujoe.top/p/%E5%B7%A5%E5%85%B7%E7%BB%8F%E9%AA%8C%E7%94%9F%E4%BA%A7%E5%8A%9B%E7%A5%9B%E9%AD%85-2026%E6%9E%84%E5%BB%BA%E4%B8%80%E4%B8%AA%E6%9C%AC%E5%9C%B0%E7%A8%B3%E5%AE%9A%E5%8F%AF%E8%BF%81%E7%A7%BB%E7%9A%84%E6%95%B0%E5%AD%97%E5%A0%A1%E5%9E%92/20260107-Picture11_hu_e60f79980d9f1cd3.jpg 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;Scrivener 展示(1)&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;122&#34;
		data-flex-basis=&#34;293px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;例如当我利用Endnote导入各种书籍、论文时，我可以直接将Endnote里的相关资料拖入Scrivener建立一个书签。当我想要看相关资料时，直接打开书签预览即可。除此，Scrivener还支持快照（我在本科论文写作时改了20个版本，因此产生了20个文档。通过Scrivener，就不会有这么多文档，对照不同快照也很便利）、批注、引文、参考文献等各种功能。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://www.laujoe.top/p/%E5%B7%A5%E5%85%B7%E7%BB%8F%E9%AA%8C%E7%94%9F%E4%BA%A7%E5%8A%9B%E7%A5%9B%E9%AD%85-2026%E6%9E%84%E5%BB%BA%E4%B8%80%E4%B8%AA%E6%9C%AC%E5%9C%B0%E7%A8%B3%E5%AE%9A%E5%8F%AF%E8%BF%81%E7%A7%BB%E7%9A%84%E6%95%B0%E5%AD%97%E5%A0%A1%E5%9E%92/20260107-Picture12.jpg&#34;
	width=&#34;2190&#34;
	height=&#34;1372&#34;
	srcset=&#34;https://www.laujoe.top/p/%E5%B7%A5%E5%85%B7%E7%BB%8F%E9%AA%8C%E7%94%9F%E4%BA%A7%E5%8A%9B%E7%A5%9B%E9%AD%85-2026%E6%9E%84%E5%BB%BA%E4%B8%80%E4%B8%AA%E6%9C%AC%E5%9C%B0%E7%A8%B3%E5%AE%9A%E5%8F%AF%E8%BF%81%E7%A7%BB%E7%9A%84%E6%95%B0%E5%AD%97%E5%A0%A1%E5%9E%92/20260107-Picture12_hu_57503991c61b38ae.jpg 480w, https://www.laujoe.top/p/%E5%B7%A5%E5%85%B7%E7%BB%8F%E9%AA%8C%E7%94%9F%E4%BA%A7%E5%8A%9B%E7%A5%9B%E9%AD%85-2026%E6%9E%84%E5%BB%BA%E4%B8%80%E4%B8%AA%E6%9C%AC%E5%9C%B0%E7%A8%B3%E5%AE%9A%E5%8F%AF%E8%BF%81%E7%A7%BB%E7%9A%84%E6%95%B0%E5%AD%97%E5%A0%A1%E5%9E%92/20260107-Picture12_hu_62b477bb1350f4ea.jpg 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;Scrivener 展示(2)&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;159&#34;
		data-flex-basis=&#34;383px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;针对学术研究中大量的档案扫描件与图片资料，一般图像软件其实并没有很好的支持，例如元数据标注需求（馆藏号、年代、作者等）。Tropy是一个免费、开源的软件，专门用于组织与处理图像，还支持图文对照录入，极大地提升了图像整理的精确度。我还会将我所利用的重要图像存储于Tropy，当我写作时，通过拖拽等动作，我可以同Scrivener建立与Endnote相同的链接。&lt;/p&gt;
&lt;p&gt;当我完成文章后，我会将它们统一放到Devonthink。每个项目都会内置相应的文件夹：（1）草稿、正文及构思；（2）草稿及正文所配图像；（3）参考资料；（4）投稿发表；（5）见刊文件等。&lt;/p&gt;
&lt;p&gt;在「草稿、正文及构思」文件夹，我会放置我的Scrivener写作文件，及其所导出的Word、Pdf等各种格式文件。在「草稿及正文所配图像」文件夹，我会放置我在正文中利用的图像，这些图像或多或少经过处理。在「参考资料」文件夹，我会将Endnote、Tropy这两个资料包放进去。&lt;/p&gt;
&lt;p&gt;经过这一套流程，我写作的每篇文章都有迹可循，并且所有原始材料都能够完整保存。虽然我主要用这套工作流进行学术创作，但我认为这套工作流能够适配各种各样的写作任务，比较具有普适性。&lt;/p&gt;
&lt;h2 id=&#34;总结&#34;&gt;总结
&lt;/h2&gt;&lt;p&gt;综上所述，我认为这套通过剥离非必要的云端协作依赖，坚持以「本地化、稳定性、可迁移性」为核心锚点的工作流，是我反复尝试过后的「当下最优解」。&lt;/p&gt;
&lt;p&gt;无论是用Docker搭建OneNav、RSSHub、newsnow等项目，还是使用Thunderbird、Tropy等开源软件，其目的都在于一个纯粹的目标：在一个AI技术、云服务大肆发展的数字世界中，每个人都有必要开辟出一块完全属于自己的、利于深度思考与知识生产的自治领地。 这便是对生产力祛魅的最深刻实践。&lt;/p&gt;
&lt;p&gt;Thank &lt;a class=&#34;link&#34; href=&#34;https://unsplash.com/photos/person-writing-on-white-paper-wcMysLw5ROM?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Cover of this article by Eugene Chystiakov&lt;/a&gt;&lt;/p&gt;
</description>
        </item>
        <item>
        <title>「SF周刊」2025年第33期（总第33期）</title>
        <link>https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A2025%E5%B9%B4%E7%AC%AC33%E6%9C%9F%E6%80%BB%E7%AC%AC33%E6%9C%9F/</link>
        <pubDate>Sun, 19 Oct 2025 00:00:00 +0000</pubDate>
        
        <guid>https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A2025%E5%B9%B4%E7%AC%AC33%E6%9C%9F%E6%80%BB%E7%AC%AC33%E6%9C%9F/</guid>
        <description>&lt;img src="https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A2025%E5%B9%B4%E7%AC%AC33%E6%9C%9F%E6%80%BB%E7%AC%AC33%E6%9C%9F/20251019-home.jpg" alt="Featured image of post 「SF周刊」2025年第33期（总第33期）" /&gt;&lt;h2 id=&#34;文章&#34;&gt;文章
&lt;/h2&gt;&lt;h3 id=&#34;two-months-agosam-altman-was-boasting-that-openai-didnt-have-to-do-sexbots-now-its-doing-sexbots-两个月前萨姆阿尔特曼还在吹嘘openai不必做性爱机器人现在它在做性爱机器人&#34;&gt;Two Months Ago，Sam Altman Was Boasting That OpenAI Didn’t Have to Do Sexbots. Now It’s Doing Sexbots 两个月前，萨姆·阿尔特曼还在吹嘘OpenAI不必做性爱机器人。现在它在做性爱机器人
&lt;/h3&gt;&lt;div class=&#34;note-card&#34;&gt;
    &lt;div class=&#34;nc-accent&#34;&gt;&lt;/div&gt;

    &lt;div class=&#34;nc-header&#34;&gt;
        &lt;div class=&#34;nc-meta&#34;&gt;
            &lt;span class=&#34;nc-badge&#34;&gt;READING&lt;/span&gt;
            &lt;span class=&#34;nc-date&#34;&gt;2025-10-19&lt;/span&gt;
        &lt;/div&gt; &lt;a href=&#34;https://futurism.com/future-society/sam-altman-adult-ai-reversal&#34; target=&#34;_blank&#34; class=&#34;nc-title&#34; title=&#34;访问原文&#34;&gt;
            Two Months Ago，Sam Altman Was Boasting That OpenAI Didn’t Have to Do Sexbots. Now It’s Doing Sexbots 两个月前，萨姆·阿尔特曼还在吹嘘OpenAI不必做性爱机器人。现在它在做性爱机器人
            &lt;svg class=&#34;nc-link-icon&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
        &lt;/a&gt;
    &lt;/div&gt;

    
    &lt;div class=&#34;nc-context&#34;&gt;
        &lt;div class=&#34;nc-quote-icon&#34;&gt;“&lt;/div&gt;
        &lt;div class=&#34;nc-summary-text&#34;&gt;OpenAI 正在改变其对成人内容的立场，计划允许“成熟应用程序”和色情内容，这与首席执行官 Sam Altman 之前的声明大相径庭。这一举措是由于在挣扎的 AI 市场中对盈利的需求所驱动的，将包括年龄验证和控制措施。然而，该公司防止剥削和虐待的能力仍然不确定，特别是考虑到未成年用户的潜在风险。&lt;/div&gt;
    &lt;/div&gt;
    

    
    
    
&lt;/div&gt;

&lt;style&gt;
     
    .note-card {
         
        --nc-bg-card: #ffffff;
        --nc-border: rgba(0,0,0,0.04);
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.08);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.12);
        
        --nc-title: #2c3e50;
        --nc-title-hover: #3a7bd5;
        --nc-meta: #999999;
        
        --nc-bg-context: #f8f9fa;
        --nc-border-context: #e2e8f0;
        --nc-quote-icon: #e2e8f0;
        --nc-text-summary: #555555;
        
        --nc-label-bg: #ffffff;
        --nc-label-text: #2d3748;
        --nc-content-text: #2d3748;
        --nc-link-icon: #cbd5e0;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.1);
        --nc-badge-text: #3a7bd5;

        position: relative;
        background: var(--nc-bg-card);
        border-radius: 12px;
        box-shadow: var(--nc-shadow);
        margin: 2.5rem 0;
        overflow: hidden;
        border: 1px solid var(--nc-border);
        font-family: inherit; 
        transition: transform 0.3s ease, box-shadow 0.3s ease, background 0.3s, border-color 0.3s;
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .note-card {
            --nc-bg-card: #1e1e1e;
            --nc-border: #333333;
            --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
            --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
            
            --nc-title: #f0f0f0;
            --nc-meta: #999999;
            
            --nc-bg-context: #252525;
            --nc-border-context: #444444;
            --nc-quote-icon: #333333;
            --nc-text-summary: #aaaaaa;
            
            --nc-label-bg: #1e1e1e;
            --nc-label-text: #cccccc;
            --nc-content-text: #dddddd;
            --nc-link-icon: #666666;
            
            --nc-badge-bg: rgba(58, 123, 213, 0.2);
        }
    }

    html[data-scheme=&#34;dark&#34;] .note-card {
        --nc-bg-card: #1e1e1e;
        --nc-border: #333333;
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
        
        --nc-title: #f0f0f0;
        --nc-meta: #999999;
        
        --nc-bg-context: #252525;
        --nc-border-context: #444444;
        --nc-quote-icon: #333333;
        --nc-text-summary: #aaaaaa;
        
        --nc-label-bg: #1e1e1e;
        --nc-label-text: #cccccc;
        --nc-content-text: #dddddd;
        --nc-link-icon: #666666;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.2);
    }

    .note-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--nc-shadow-hover);
    }

     
    .nc-accent {
        height: 4px;
        background: linear-gradient(90deg, #3a7bd5, #00d2ff); 
        width: 100%;
    }

     
    .nc-header {
        padding: 24px 28px 10px; 
    }

    .nc-meta {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 10px; 
        font-size: 13px; 
        color: var(--nc-meta);
        font-weight: 600;
        letter-spacing: 1px;
        text-transform: uppercase;
    }

    .nc-badge {
        color: var(--nc-badge-text);
        background: var(--nc-badge-bg);
        padding: 2px 6px;
        border-radius: 4px;
    }

    .nc-title {
        display: block;
        font-size: 2rem; 
        font-weight: 700;
        color: var(--nc-title);
        text-decoration: none;
        line-height: 1.3;
        transition: color 0.2s;
    }

    .nc-title:hover {
        color: var(--nc-title-hover);
    }

    .nc-link-icon {
        width: 20px; 
        height: 20px;
        color: var(--nc-link-icon);
        margin-left: 5px;
        vertical-align: middle;
        transition: color 0.2s;
    }

    .nc-title:hover .nc-link-icon {
        color: var(--nc-title-hover);
    }

     
    .nc-context {
        margin: 12px 28px 24px;
        background: var(--nc-bg-context);
        padding: 20px 24px;
        border-radius: 8px;
        position: relative;
        border-left: 4px solid var(--nc-border-context);
        transition: background 0.3s, border-color 0.3s;
    }

    .nc-quote-icon {
        position: absolute;
        top: 8px;
        left: 10px;
        font-family: serif; 
        font-size: 40px;
        line-height: 1;
        color: var(--nc-quote-icon);
        pointer-events: none;
        transition: color 0.3s;
    }

    .nc-summary-text {
        font-size: 1.7rem; 
        color: var(--nc-text-summary);
        line-height: 1.6;
        font-style: italic;
        position: relative;
        z-index: 1;
        padding-left: 15px; 
        transition: color 0.3s;
    }

     
    .nc-body {
        padding: 0 28px 32px;
        position: relative;
    }

     
    .nc-label {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        font-size: 13px; 
        font-weight: 700;
        color: var(--nc-label-text);
        background: var(--nc-label-bg);
        padding-right: 10px;
        margin-bottom: 12px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
        transition: color 0.3s, background 0.3s;
    }

    .nc-content {
        color: var(--nc-content-text);
        font-size: 1.6rem; 
        line-height: 1.75;
        transition: color 0.3s;
    }

     
    .nc-content p { margin-bottom: 1em; }
    .nc-content p:last-child { margin-bottom: 0; }
    
    .nc-content ul { padding-left: 20px; color: inherit; }
    .nc-content li { margin-bottom: 6px; }
&lt;/style&gt;
&lt;h3 id=&#34;当-obsidian-遇上-claude-code知识管理的革命性升级&#34;&gt;当 Obsidian 遇上 Claude Code：知识管理的革命性升级
&lt;/h3&gt;&lt;div class=&#34;note-card&#34;&gt;
    &lt;div class=&#34;nc-accent&#34;&gt;&lt;/div&gt;

    &lt;div class=&#34;nc-header&#34;&gt;
        &lt;div class=&#34;nc-meta&#34;&gt;
            &lt;span class=&#34;nc-badge&#34;&gt;READING&lt;/span&gt;
            &lt;span class=&#34;nc-date&#34;&gt;2025-10-19&lt;/span&gt;
        &lt;/div&gt; &lt;a href=&#34;https://sspai.com/post/103119&#34; target=&#34;_blank&#34; class=&#34;nc-title&#34; title=&#34;访问原文&#34;&gt;
            当 Obsidian 遇上 Claude Code：知识管理的革命性升级
            &lt;svg class=&#34;nc-link-icon&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
        &lt;/a&gt;
    &lt;/div&gt;

    
    &lt;div class=&#34;nc-context&#34;&gt;
        &lt;div class=&#34;nc-quote-icon&#34;&gt;“&lt;/div&gt;
        &lt;div class=&#34;nc-summary-text&#34;&gt;Obsidian 笔记应用程序可以通过集成 AI 智能体 Claude Code 实现革新。这种配对允许用户自动化诸如生成每日报告、查找文档和编辑元数据等任务。Claude Code 协助创建数据库、修改属性，甚至在 Obsidian 中开发插件。设置和使用 Claude Code 需要一些技术知识，但其好处，包括简化的工作流程和提高的效率，使其成为 Obsidian 的一个有价值的补充。&lt;/div&gt;
    &lt;/div&gt;
    

    
    
    
&lt;/div&gt;

&lt;style&gt;
     
    .note-card {
         
        --nc-bg-card: #ffffff;
        --nc-border: rgba(0,0,0,0.04);
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.08);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.12);
        
        --nc-title: #2c3e50;
        --nc-title-hover: #3a7bd5;
        --nc-meta: #999999;
        
        --nc-bg-context: #f8f9fa;
        --nc-border-context: #e2e8f0;
        --nc-quote-icon: #e2e8f0;
        --nc-text-summary: #555555;
        
        --nc-label-bg: #ffffff;
        --nc-label-text: #2d3748;
        --nc-content-text: #2d3748;
        --nc-link-icon: #cbd5e0;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.1);
        --nc-badge-text: #3a7bd5;

        position: relative;
        background: var(--nc-bg-card);
        border-radius: 12px;
        box-shadow: var(--nc-shadow);
        margin: 2.5rem 0;
        overflow: hidden;
        border: 1px solid var(--nc-border);
        font-family: inherit; 
        transition: transform 0.3s ease, box-shadow 0.3s ease, background 0.3s, border-color 0.3s;
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .note-card {
            --nc-bg-card: #1e1e1e;
            --nc-border: #333333;
            --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
            --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
            
            --nc-title: #f0f0f0;
            --nc-meta: #999999;
            
            --nc-bg-context: #252525;
            --nc-border-context: #444444;
            --nc-quote-icon: #333333;
            --nc-text-summary: #aaaaaa;
            
            --nc-label-bg: #1e1e1e;
            --nc-label-text: #cccccc;
            --nc-content-text: #dddddd;
            --nc-link-icon: #666666;
            
            --nc-badge-bg: rgba(58, 123, 213, 0.2);
        }
    }

    html[data-scheme=&#34;dark&#34;] .note-card {
        --nc-bg-card: #1e1e1e;
        --nc-border: #333333;
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
        
        --nc-title: #f0f0f0;
        --nc-meta: #999999;
        
        --nc-bg-context: #252525;
        --nc-border-context: #444444;
        --nc-quote-icon: #333333;
        --nc-text-summary: #aaaaaa;
        
        --nc-label-bg: #1e1e1e;
        --nc-label-text: #cccccc;
        --nc-content-text: #dddddd;
        --nc-link-icon: #666666;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.2);
    }

    .note-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--nc-shadow-hover);
    }

     
    .nc-accent {
        height: 4px;
        background: linear-gradient(90deg, #3a7bd5, #00d2ff); 
        width: 100%;
    }

     
    .nc-header {
        padding: 24px 28px 10px; 
    }

    .nc-meta {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 10px; 
        font-size: 13px; 
        color: var(--nc-meta);
        font-weight: 600;
        letter-spacing: 1px;
        text-transform: uppercase;
    }

    .nc-badge {
        color: var(--nc-badge-text);
        background: var(--nc-badge-bg);
        padding: 2px 6px;
        border-radius: 4px;
    }

    .nc-title {
        display: block;
        font-size: 2rem; 
        font-weight: 700;
        color: var(--nc-title);
        text-decoration: none;
        line-height: 1.3;
        transition: color 0.2s;
    }

    .nc-title:hover {
        color: var(--nc-title-hover);
    }

    .nc-link-icon {
        width: 20px; 
        height: 20px;
        color: var(--nc-link-icon);
        margin-left: 5px;
        vertical-align: middle;
        transition: color 0.2s;
    }

    .nc-title:hover .nc-link-icon {
        color: var(--nc-title-hover);
    }

     
    .nc-context {
        margin: 12px 28px 24px;
        background: var(--nc-bg-context);
        padding: 20px 24px;
        border-radius: 8px;
        position: relative;
        border-left: 4px solid var(--nc-border-context);
        transition: background 0.3s, border-color 0.3s;
    }

    .nc-quote-icon {
        position: absolute;
        top: 8px;
        left: 10px;
        font-family: serif; 
        font-size: 40px;
        line-height: 1;
        color: var(--nc-quote-icon);
        pointer-events: none;
        transition: color 0.3s;
    }

    .nc-summary-text {
        font-size: 1.7rem; 
        color: var(--nc-text-summary);
        line-height: 1.6;
        font-style: italic;
        position: relative;
        z-index: 1;
        padding-left: 15px; 
        transition: color 0.3s;
    }

     
    .nc-body {
        padding: 0 28px 32px;
        position: relative;
    }

     
    .nc-label {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        font-size: 13px; 
        font-weight: 700;
        color: var(--nc-label-text);
        background: var(--nc-label-bg);
        padding-right: 10px;
        margin-bottom: 12px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
        transition: color 0.3s, background 0.3s;
    }

    .nc-content {
        color: var(--nc-content-text);
        font-size: 1.6rem; 
        line-height: 1.75;
        transition: color 0.3s;
    }

     
    .nc-content p { margin-bottom: 1em; }
    .nc-content p:last-child { margin-bottom: 0; }
    
    .nc-content ul { padding-left: 20px; color: inherit; }
    .nc-content li { margin-bottom: 6px; }
&lt;/style&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-2&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        每日保存了内容，写作了新的内容以后，让 Claude Code 根据今天更新的内容，写下一份报告，总结，并给自己更多的思考。
    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-2&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-3&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        图片里，我的使用案例是让 Claude 帮我找到有关”王慧文”的所有文档，Cladue 会使用命令行工具在整个 Obsidian 里检索“王慧文”，并把相关的文档推给我。
    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-3&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-4&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        &lt;p&gt;两个月前，Obsidian 发布了数据库(Base) 功能，很多朋友可能还没有用起来。&lt;/p&gt;
&lt;p&gt;如果你不想学习怎么使用 Base，又想要像 Notion 中的 Database 一样使用 Obsidian，可以通过 Claude Code 来帮助你创建数据库。&lt;/p&gt;
&lt;p&gt;提供一定的知识后，就可以让 Claude Code 自动创建数据库。在后文中，我会分享我的 claude.md 文件，让你可以一句创建知识库。&lt;/p&gt;

    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-4&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-5&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        如果你想要在 Obsidian 里实现一些效果，但在社区插件中有找不到插件满足自己的需求，也可以用 Claude Code 开发一个属于自己的插件。
    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-5&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;
&lt;h3 id=&#34;元青花广彩瓷等文物讲述千年外贸史&#34;&gt;元青花、广彩瓷等文物讲述千年外贸史
&lt;/h3&gt;&lt;div class=&#34;note-card&#34;&gt;
    &lt;div class=&#34;nc-accent&#34;&gt;&lt;/div&gt;

    &lt;div class=&#34;nc-header&#34;&gt;
        &lt;div class=&#34;nc-meta&#34;&gt;
            &lt;span class=&#34;nc-badge&#34;&gt;READING&lt;/span&gt;
            &lt;span class=&#34;nc-date&#34;&gt;2025-10-19&lt;/span&gt;
        &lt;/div&gt; &lt;a href=&#34;https://m.thepaper.cn/detail/31783972&#34; target=&#34;_blank&#34; class=&#34;nc-title&#34; title=&#34;访问原文&#34;&gt;
            元青花、广彩瓷等文物讲述千年外贸史
            &lt;svg class=&#34;nc-link-icon&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
        &lt;/a&gt;
    &lt;/div&gt;

    
    &lt;div class=&#34;nc-context&#34;&gt;
        &lt;div class=&#34;nc-quote-icon&#34;&gt;“&lt;/div&gt;
        &lt;div class=&#34;nc-summary-text&#34;&gt;“千年粤商——广东对外贸易展”展出逾200件来自各博物馆的文物，展现了广东在一千多年来中国对外贸易中的关键作用。展览涵盖了元代青花瓷和清代外销瓷等展品，突出了该省的优越地理位置、创新贸易政策和文化交流，从古代海上贸易到现代的广交会和自由贸易区，展示了广东的贸易发展历程。&lt;/div&gt;
    &lt;/div&gt;
    

    
    
    
&lt;/div&gt;

&lt;style&gt;
     
    .note-card {
         
        --nc-bg-card: #ffffff;
        --nc-border: rgba(0,0,0,0.04);
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.08);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.12);
        
        --nc-title: #2c3e50;
        --nc-title-hover: #3a7bd5;
        --nc-meta: #999999;
        
        --nc-bg-context: #f8f9fa;
        --nc-border-context: #e2e8f0;
        --nc-quote-icon: #e2e8f0;
        --nc-text-summary: #555555;
        
        --nc-label-bg: #ffffff;
        --nc-label-text: #2d3748;
        --nc-content-text: #2d3748;
        --nc-link-icon: #cbd5e0;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.1);
        --nc-badge-text: #3a7bd5;

        position: relative;
        background: var(--nc-bg-card);
        border-radius: 12px;
        box-shadow: var(--nc-shadow);
        margin: 2.5rem 0;
        overflow: hidden;
        border: 1px solid var(--nc-border);
        font-family: inherit; 
        transition: transform 0.3s ease, box-shadow 0.3s ease, background 0.3s, border-color 0.3s;
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .note-card {
            --nc-bg-card: #1e1e1e;
            --nc-border: #333333;
            --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
            --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
            
            --nc-title: #f0f0f0;
            --nc-meta: #999999;
            
            --nc-bg-context: #252525;
            --nc-border-context: #444444;
            --nc-quote-icon: #333333;
            --nc-text-summary: #aaaaaa;
            
            --nc-label-bg: #1e1e1e;
            --nc-label-text: #cccccc;
            --nc-content-text: #dddddd;
            --nc-link-icon: #666666;
            
            --nc-badge-bg: rgba(58, 123, 213, 0.2);
        }
    }

    html[data-scheme=&#34;dark&#34;] .note-card {
        --nc-bg-card: #1e1e1e;
        --nc-border: #333333;
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
        
        --nc-title: #f0f0f0;
        --nc-meta: #999999;
        
        --nc-bg-context: #252525;
        --nc-border-context: #444444;
        --nc-quote-icon: #333333;
        --nc-text-summary: #aaaaaa;
        
        --nc-label-bg: #1e1e1e;
        --nc-label-text: #cccccc;
        --nc-content-text: #dddddd;
        --nc-link-icon: #666666;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.2);
    }

    .note-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--nc-shadow-hover);
    }

     
    .nc-accent {
        height: 4px;
        background: linear-gradient(90deg, #3a7bd5, #00d2ff); 
        width: 100%;
    }

     
    .nc-header {
        padding: 24px 28px 10px; 
    }

    .nc-meta {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 10px; 
        font-size: 13px; 
        color: var(--nc-meta);
        font-weight: 600;
        letter-spacing: 1px;
        text-transform: uppercase;
    }

    .nc-badge {
        color: var(--nc-badge-text);
        background: var(--nc-badge-bg);
        padding: 2px 6px;
        border-radius: 4px;
    }

    .nc-title {
        display: block;
        font-size: 2rem; 
        font-weight: 700;
        color: var(--nc-title);
        text-decoration: none;
        line-height: 1.3;
        transition: color 0.2s;
    }

    .nc-title:hover {
        color: var(--nc-title-hover);
    }

    .nc-link-icon {
        width: 20px; 
        height: 20px;
        color: var(--nc-link-icon);
        margin-left: 5px;
        vertical-align: middle;
        transition: color 0.2s;
    }

    .nc-title:hover .nc-link-icon {
        color: var(--nc-title-hover);
    }

     
    .nc-context {
        margin: 12px 28px 24px;
        background: var(--nc-bg-context);
        padding: 20px 24px;
        border-radius: 8px;
        position: relative;
        border-left: 4px solid var(--nc-border-context);
        transition: background 0.3s, border-color 0.3s;
    }

    .nc-quote-icon {
        position: absolute;
        top: 8px;
        left: 10px;
        font-family: serif; 
        font-size: 40px;
        line-height: 1;
        color: var(--nc-quote-icon);
        pointer-events: none;
        transition: color 0.3s;
    }

    .nc-summary-text {
        font-size: 1.7rem; 
        color: var(--nc-text-summary);
        line-height: 1.6;
        font-style: italic;
        position: relative;
        z-index: 1;
        padding-left: 15px; 
        transition: color 0.3s;
    }

     
    .nc-body {
        padding: 0 28px 32px;
        position: relative;
    }

     
    .nc-label {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        font-size: 13px; 
        font-weight: 700;
        color: var(--nc-label-text);
        background: var(--nc-label-bg);
        padding-right: 10px;
        margin-bottom: 12px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
        transition: color 0.3s, background 0.3s;
    }

    .nc-content {
        color: var(--nc-content-text);
        font-size: 1.6rem; 
        line-height: 1.75;
        transition: color 0.3s;
    }

     
    .nc-content p { margin-bottom: 1em; }
    .nc-content p:last-child { margin-bottom: 0; }
    
    .nc-content ul { padding-left: 20px; color: inherit; }
    .nc-content li { margin-bottom: 6px; }
&lt;/style&gt;
&lt;h3 id=&#34;元青花广彩瓷等文物讲述千年外贸史-1&#34;&gt;元青花、广彩瓷等文物讲述千年外贸史
&lt;/h3&gt;&lt;div class=&#34;note-card&#34;&gt;
    &lt;div class=&#34;nc-accent&#34;&gt;&lt;/div&gt;

    &lt;div class=&#34;nc-header&#34;&gt;
        &lt;div class=&#34;nc-meta&#34;&gt;
            &lt;span class=&#34;nc-badge&#34;&gt;READING&lt;/span&gt;
            &lt;span class=&#34;nc-date&#34;&gt;2025-10-19&lt;/span&gt;
        &lt;/div&gt; &lt;a href=&#34;https://m.thepaper.cn/detail/31783972&#34; target=&#34;_blank&#34; class=&#34;nc-title&#34; title=&#34;访问原文&#34;&gt;
            元青花、广彩瓷等文物讲述千年外贸史
            &lt;svg class=&#34;nc-link-icon&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
        &lt;/a&gt;
    &lt;/div&gt;

    
    &lt;div class=&#34;nc-context&#34;&gt;
        &lt;div class=&#34;nc-quote-icon&#34;&gt;“&lt;/div&gt;
        &lt;div class=&#34;nc-summary-text&#34;&gt;“千年粤商——广东对外贸易展”展出逾200件来自各博物馆的文物，展现了广东在一千多年来中国对外贸易中的关键作用。展览涵盖了元代青花瓷和清代外销瓷等展品，突出了该省的优越地理位置、创新贸易政策和文化交流，从古代海上贸易到现代的广交会和自由贸易区，展示了广东的贸易发展历程。&lt;/div&gt;
    &lt;/div&gt;
    

    
    
    
&lt;/div&gt;

&lt;style&gt;
     
    .note-card {
         
        --nc-bg-card: #ffffff;
        --nc-border: rgba(0,0,0,0.04);
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.08);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.12);
        
        --nc-title: #2c3e50;
        --nc-title-hover: #3a7bd5;
        --nc-meta: #999999;
        
        --nc-bg-context: #f8f9fa;
        --nc-border-context: #e2e8f0;
        --nc-quote-icon: #e2e8f0;
        --nc-text-summary: #555555;
        
        --nc-label-bg: #ffffff;
        --nc-label-text: #2d3748;
        --nc-content-text: #2d3748;
        --nc-link-icon: #cbd5e0;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.1);
        --nc-badge-text: #3a7bd5;

        position: relative;
        background: var(--nc-bg-card);
        border-radius: 12px;
        box-shadow: var(--nc-shadow);
        margin: 2.5rem 0;
        overflow: hidden;
        border: 1px solid var(--nc-border);
        font-family: inherit; 
        transition: transform 0.3s ease, box-shadow 0.3s ease, background 0.3s, border-color 0.3s;
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .note-card {
            --nc-bg-card: #1e1e1e;
            --nc-border: #333333;
            --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
            --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
            
            --nc-title: #f0f0f0;
            --nc-meta: #999999;
            
            --nc-bg-context: #252525;
            --nc-border-context: #444444;
            --nc-quote-icon: #333333;
            --nc-text-summary: #aaaaaa;
            
            --nc-label-bg: #1e1e1e;
            --nc-label-text: #cccccc;
            --nc-content-text: #dddddd;
            --nc-link-icon: #666666;
            
            --nc-badge-bg: rgba(58, 123, 213, 0.2);
        }
    }

    html[data-scheme=&#34;dark&#34;] .note-card {
        --nc-bg-card: #1e1e1e;
        --nc-border: #333333;
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
        
        --nc-title: #f0f0f0;
        --nc-meta: #999999;
        
        --nc-bg-context: #252525;
        --nc-border-context: #444444;
        --nc-quote-icon: #333333;
        --nc-text-summary: #aaaaaa;
        
        --nc-label-bg: #1e1e1e;
        --nc-label-text: #cccccc;
        --nc-content-text: #dddddd;
        --nc-link-icon: #666666;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.2);
    }

    .note-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--nc-shadow-hover);
    }

     
    .nc-accent {
        height: 4px;
        background: linear-gradient(90deg, #3a7bd5, #00d2ff); 
        width: 100%;
    }

     
    .nc-header {
        padding: 24px 28px 10px; 
    }

    .nc-meta {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 10px; 
        font-size: 13px; 
        color: var(--nc-meta);
        font-weight: 600;
        letter-spacing: 1px;
        text-transform: uppercase;
    }

    .nc-badge {
        color: var(--nc-badge-text);
        background: var(--nc-badge-bg);
        padding: 2px 6px;
        border-radius: 4px;
    }

    .nc-title {
        display: block;
        font-size: 2rem; 
        font-weight: 700;
        color: var(--nc-title);
        text-decoration: none;
        line-height: 1.3;
        transition: color 0.2s;
    }

    .nc-title:hover {
        color: var(--nc-title-hover);
    }

    .nc-link-icon {
        width: 20px; 
        height: 20px;
        color: var(--nc-link-icon);
        margin-left: 5px;
        vertical-align: middle;
        transition: color 0.2s;
    }

    .nc-title:hover .nc-link-icon {
        color: var(--nc-title-hover);
    }

     
    .nc-context {
        margin: 12px 28px 24px;
        background: var(--nc-bg-context);
        padding: 20px 24px;
        border-radius: 8px;
        position: relative;
        border-left: 4px solid var(--nc-border-context);
        transition: background 0.3s, border-color 0.3s;
    }

    .nc-quote-icon {
        position: absolute;
        top: 8px;
        left: 10px;
        font-family: serif; 
        font-size: 40px;
        line-height: 1;
        color: var(--nc-quote-icon);
        pointer-events: none;
        transition: color 0.3s;
    }

    .nc-summary-text {
        font-size: 1.7rem; 
        color: var(--nc-text-summary);
        line-height: 1.6;
        font-style: italic;
        position: relative;
        z-index: 1;
        padding-left: 15px; 
        transition: color 0.3s;
    }

     
    .nc-body {
        padding: 0 28px 32px;
        position: relative;
    }

     
    .nc-label {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        font-size: 13px; 
        font-weight: 700;
        color: var(--nc-label-text);
        background: var(--nc-label-bg);
        padding-right: 10px;
        margin-bottom: 12px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
        transition: color 0.3s, background 0.3s;
    }

    .nc-content {
        color: var(--nc-content-text);
        font-size: 1.6rem; 
        line-height: 1.75;
        transition: color 0.3s;
    }

     
    .nc-content p { margin-bottom: 1em; }
    .nc-content p:last-child { margin-bottom: 0; }
    
    .nc-content ul { padding-left: 20px; color: inherit; }
    .nc-content li { margin-bottom: 6px; }
&lt;/style&gt;
&lt;h3 id=&#34;马锋孙于晨东西贯通丝绸之路研究的未来方向&#34;&gt;马锋、孙于晨｜东西贯通：丝绸之路研究的未来方向
&lt;/h3&gt;&lt;div class=&#34;note-card&#34;&gt;
    &lt;div class=&#34;nc-accent&#34;&gt;&lt;/div&gt;

    &lt;div class=&#34;nc-header&#34;&gt;
        &lt;div class=&#34;nc-meta&#34;&gt;
            &lt;span class=&#34;nc-badge&#34;&gt;READING&lt;/span&gt;
            &lt;span class=&#34;nc-date&#34;&gt;2025-10-19&lt;/span&gt;
        &lt;/div&gt; &lt;a href=&#34;https://www.thepaper.cn/newsDetail_forward_31771696&#34; target=&#34;_blank&#34; class=&#34;nc-title&#34; title=&#34;访问原文&#34;&gt;
            马锋、孙于晨｜东西贯通：丝绸之路研究的未来方向
            &lt;svg class=&#34;nc-link-icon&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
        &lt;/a&gt;
    &lt;/div&gt;

    
    &lt;div class=&#34;nc-context&#34;&gt;
        &lt;div class=&#34;nc-quote-icon&#34;&gt;“&lt;/div&gt;
        &lt;div class=&#34;nc-summary-text&#34;&gt;这篇文章评述了《拜占庭、中间族群与丝绸之路视角下中国关系研究》一书。文章主张未来的丝绸之路研究应整合东西方视角，涵盖历史文献和事实。该书的优势在于融合了中国史和世界史，并具有超越国家或文明视角的全球史视野，这可能推进丝绸之路研究。&lt;/div&gt;
    &lt;/div&gt;
    

    
    
    
&lt;/div&gt;

&lt;style&gt;
     
    .note-card {
         
        --nc-bg-card: #ffffff;
        --nc-border: rgba(0,0,0,0.04);
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.08);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.12);
        
        --nc-title: #2c3e50;
        --nc-title-hover: #3a7bd5;
        --nc-meta: #999999;
        
        --nc-bg-context: #f8f9fa;
        --nc-border-context: #e2e8f0;
        --nc-quote-icon: #e2e8f0;
        --nc-text-summary: #555555;
        
        --nc-label-bg: #ffffff;
        --nc-label-text: #2d3748;
        --nc-content-text: #2d3748;
        --nc-link-icon: #cbd5e0;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.1);
        --nc-badge-text: #3a7bd5;

        position: relative;
        background: var(--nc-bg-card);
        border-radius: 12px;
        box-shadow: var(--nc-shadow);
        margin: 2.5rem 0;
        overflow: hidden;
        border: 1px solid var(--nc-border);
        font-family: inherit; 
        transition: transform 0.3s ease, box-shadow 0.3s ease, background 0.3s, border-color 0.3s;
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .note-card {
            --nc-bg-card: #1e1e1e;
            --nc-border: #333333;
            --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
            --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
            
            --nc-title: #f0f0f0;
            --nc-meta: #999999;
            
            --nc-bg-context: #252525;
            --nc-border-context: #444444;
            --nc-quote-icon: #333333;
            --nc-text-summary: #aaaaaa;
            
            --nc-label-bg: #1e1e1e;
            --nc-label-text: #cccccc;
            --nc-content-text: #dddddd;
            --nc-link-icon: #666666;
            
            --nc-badge-bg: rgba(58, 123, 213, 0.2);
        }
    }

    html[data-scheme=&#34;dark&#34;] .note-card {
        --nc-bg-card: #1e1e1e;
        --nc-border: #333333;
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
        
        --nc-title: #f0f0f0;
        --nc-meta: #999999;
        
        --nc-bg-context: #252525;
        --nc-border-context: #444444;
        --nc-quote-icon: #333333;
        --nc-text-summary: #aaaaaa;
        
        --nc-label-bg: #1e1e1e;
        --nc-label-text: #cccccc;
        --nc-content-text: #dddddd;
        --nc-link-icon: #666666;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.2);
    }

    .note-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--nc-shadow-hover);
    }

     
    .nc-accent {
        height: 4px;
        background: linear-gradient(90deg, #3a7bd5, #00d2ff); 
        width: 100%;
    }

     
    .nc-header {
        padding: 24px 28px 10px; 
    }

    .nc-meta {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 10px; 
        font-size: 13px; 
        color: var(--nc-meta);
        font-weight: 600;
        letter-spacing: 1px;
        text-transform: uppercase;
    }

    .nc-badge {
        color: var(--nc-badge-text);
        background: var(--nc-badge-bg);
        padding: 2px 6px;
        border-radius: 4px;
    }

    .nc-title {
        display: block;
        font-size: 2rem; 
        font-weight: 700;
        color: var(--nc-title);
        text-decoration: none;
        line-height: 1.3;
        transition: color 0.2s;
    }

    .nc-title:hover {
        color: var(--nc-title-hover);
    }

    .nc-link-icon {
        width: 20px; 
        height: 20px;
        color: var(--nc-link-icon);
        margin-left: 5px;
        vertical-align: middle;
        transition: color 0.2s;
    }

    .nc-title:hover .nc-link-icon {
        color: var(--nc-title-hover);
    }

     
    .nc-context {
        margin: 12px 28px 24px;
        background: var(--nc-bg-context);
        padding: 20px 24px;
        border-radius: 8px;
        position: relative;
        border-left: 4px solid var(--nc-border-context);
        transition: background 0.3s, border-color 0.3s;
    }

    .nc-quote-icon {
        position: absolute;
        top: 8px;
        left: 10px;
        font-family: serif; 
        font-size: 40px;
        line-height: 1;
        color: var(--nc-quote-icon);
        pointer-events: none;
        transition: color 0.3s;
    }

    .nc-summary-text {
        font-size: 1.7rem; 
        color: var(--nc-text-summary);
        line-height: 1.6;
        font-style: italic;
        position: relative;
        z-index: 1;
        padding-left: 15px; 
        transition: color 0.3s;
    }

     
    .nc-body {
        padding: 0 28px 32px;
        position: relative;
    }

     
    .nc-label {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        font-size: 13px; 
        font-weight: 700;
        color: var(--nc-label-text);
        background: var(--nc-label-bg);
        padding-right: 10px;
        margin-bottom: 12px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
        transition: color 0.3s, background 0.3s;
    }

    .nc-content {
        color: var(--nc-content-text);
        font-size: 1.6rem; 
        line-height: 1.75;
        transition: color 0.3s;
    }

     
    .nc-content p { margin-bottom: 1em; }
    .nc-content p:last-child { margin-bottom: 0; }
    
    .nc-content ul { padding-left: 20px; color: inherit; }
    .nc-content li { margin-bottom: 6px; }
&lt;/style&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-9&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        丝绸之路是学界研究的热点领域，是国内学界参与国际学术前沿论坛的重要切入点。国内学人有关的研究成果获得了国际学界的公认。从早期的夏鼐、张星烺、朱谦之到今日的王治来、余太山、蓝琪、刘迎胜，诸位先贤都为国际丝绸之路研究贡献了中国智慧（代表性成果有：夏鼐：《咸阳底张湾隋墓出土的东罗马金币》，《考古学报》1959年第三期；夏鼐：《中世纪中国和拜占庭的关系》，《世界历史》1980年第四期；张星烺：《欧化东渐史》，商务印书馆，2000年；张星烺：《中西交通史料汇编》，中华书局，2003年；朱谦之：《中国景教》，商务印书馆，2016年；王治来：《中亚通史[古代卷]》，新疆人民出版社，2004年；余太山：《古代地中海和中国关系史研究》，商务印书馆，2012年；蓝琪主编：《中亚史》，商务印书馆，2020年；刘迎胜：《古代中国与亚洲文明》，甘肃教育出版社，2023年）。丝绸之路研究不仅获得国内中国史研究人员的重视，也是国内世界史研究者的关注重点之一，代表性人物有王治来、蓝琪、张绪山、林英等前辈（代表性成果有：张绪山：《6-7世纪拜占庭帝国与西突厥汗国的交往》，《世界历史》2002年第一期；张绪山：《景教东渐及传入中国的希腊—拜占庭文化》，《世界历史》2005年第六期；张绪山：《中国与拜占庭帝国关系研究》，中华书局，2012年；林英：《唐代西域的可萨汗国》，《中山大学学报》2000年第一期；林英：《唐代拂菻丛说》，中华书局，2006年；林英：《公元1到5世纪中国文献中关于罗马帝国的传闻——以〈后汉书·大秦传〉为中心的考察》，《古代文明》2009年第四期）。国内学者研究丝绸之路的视域从中国史转变到世界史和中国史的融合，既反映了国内学人知识构成的合理性，又是丝绸之路研究的必然要求，是突破已有研究的重要创新点。张爽、薛海波的《丝路视域下拜占庭、中介民族与中国关系研究》（以下简称“《丝路视域》”）是国内学界这方面的代表性成果，呈现出世界史和中国史互融的特点，体现在史料、史实和视域三个方面。
    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-9&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-10&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        从东西史料贯通的角度研究丝绸之路可以分为两个不同的领域：一是研究有大量史书记载的中国、罗马、拜占庭帝国的丝绸之路。中国和罗马-拜占庭均重视史学为现实服务，所以官方和民间都重视史学的发展。中国与拜占庭帝国可以说是中古时代最重视史学编撰的地区和国家。诚然古代的史学典籍极少记载经济内容，有关对外交往中的物资交流也不是外交史关注的重点，所以史书中有关丝绸之路的记载较为稀缺。只有中国和罗马-拜占庭帝国这类国家拥有的丰富史学典籍才能够提供有限的丝绸之路史料。而中国和罗马-拜占庭帝国正是丝绸之路的东西端点所在地，是丝绸之路的重要参与国。中国和罗马-拜占庭帝国长期大一统状态与和平环境也为丝绸之路的发展和史学编撰提供了有利的外部环境。然而，丝绸之路的记载从认识论上而言本质上是不同区域的人群对世界的认识，既反映了当时当地人的世界史视域，也呈现了古人世界史认识的局限性。比如中国人中除了杜环外极少有人亲自前往地中海沿岸，中国对西部世界的认识局限在伊朗高原，而罗马-拜占庭人对东方的认识局限在中亚地区。（米南德[Menander]记载了拜占庭人到访中亚。有关提比略[Tiberius，578-582]当政时期拜占庭帝国与西突厥汗国交往的详细情况可以参见Menander，The History of Menander the Guardsman，trans. R. C. Blockley，Liverpool: Francis Cairns [Publications] Ltd，1985，pp. 171-179.赛奥费拉克斯·西摩卡塔[Theophylact Simocatta]也记载了诸多中亚的风俗。参见Theophylact Simocatta，The History of Theophylact Simocatta，trans. Michael and Mary Whitby，Oxford: Oxford University Press，1986. 杜环，又名杜还，是唐代旅行家，也是著名史学家杜佑的族子。他在天宝十载[公元751年]作为随军书记官跟随将领高仙芝出征，深入中亚。唐军在怛罗斯城与大食交战。两军相持五日后，唐军因为葛逻禄部落背叛而最终战败，杜环随之被俘。他也因此得以在中亚及地中海东部地区游历十余年。宝应初年[762年]随商船从广州回国，将自身在异国的所见所闻写作《经行记》。此书主要记述了西域各国的基本信息与风土人情。现原书已失传，仅剩一千五百余字保留在杜佑的《通典》中。杜环的游记虽然未能完整保存，但残留部分文章短小精悍，关于各国的记载有独到的细节，是研究中西交流史和中亚、西亚国家历史的重要一手资料。）因此双方的史料也因认知的局限所涉及的空间范围有限，不能够全面准确地反映丝绸之路的真实情况，并且他们对中间地区的认识是模糊的。这个领域的史料贯通要求做到史料互相印证，通过合理的逻辑分析，用现代的眼光去检视古人的局限。
    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-10&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-11&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        东西史料贯通不仅仅是停留在常见的东西方文献层面，丝绸之路研究的深入推进还需要重视挖掘非著名史料。中国蚕种西传拜占庭帝国一事是丝绸之路研究的重要历史。《丝路视域》在第二章第一节“四到六世纪拜占庭社会经济中的丝绸与丝绸贸易”中谈到了拜占庭史家普罗柯比的记载（81页）。如果能够找到相关的中国史籍的记载相互印证，则能更准确地构建史实。也可以进一步挖掘拜占庭史料，寻找记载蚕种西传的其他史料（张绪山提到拜占庭史家佐纳拉[Zonaras]和赛奥凡尼·拜占庭[Theophanes of Byzantios]的史书中都提及此事。参见张绪山：《中国与拜占庭帝国关系研究》，中华书局，2012年，87-88页）。挖掘非著名史料是丝绸之路研究进一步推进的必然要求。拜占庭帝国的传世文献有诸多记载丝绸之路历史的非著名作品。拜占庭史家普利斯库斯（Prisucs）、米南德和赛奥费拉克斯·西摩卡塔比较详细地记载了拜占庭与西突厥汗国交往的历史和中亚的风土人情，阿加西阿斯（Agathias）、米南德和忏悔者塞奥法尼斯（Theophanes Confessor）的作品较多记载了萨珊波斯帝国的历史。这些非著名史家的史料在书中多有使用。
    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-11&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-12&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        第二个领域是研究丝绸之路上欠缺史书典籍的国家和族群。它们又可以分为两类。一类是没有文献记载传统的族群，多为游牧民族，比如该书重点研究的柔然人、匈奴人。他们参与丝绸之路的活动需要域外文明地区的记载提供最基本的史料。柔然人和匈奴人的历史是中国历史的一部分，都可能与罗马-拜占庭帝国有一定的关系（西方史料记载的相关族群是不是中国的柔然人和匈奴人仍旧存在争议，学界对匈奴和匈人关系的争议，可以参见余太山：《古代地中海和中国关系史研究》，商务印书馆，2012年，234-266页；约达尼斯：《哥特史》，罗三洋译，商务印书馆，2013年，译者序ⅵ-ⅻ页），所以东西方的史料为其提供了有限的材料。二是有文献记载，但是并无太多的史学典籍传世的国家和族群，比如印度和波斯。印度没有史学书写的传统，在伊斯兰教传入之前，印度并没有符合中国和西方标准的严格意义上的“历史学”典籍。印度史学对丝绸之路的记载有限，而印度及其影响地区又是丝绸之路的重要区域。波斯的文献中史学文献也较少，由于阿拉伯人的毁坏，存世的史料几近阙无。而萨珊波斯帝国是丝绸之路的重要参与者，是丝绸之路的主体区域。因此以萨珊波斯帝国为代表的伊朗文化区是丝绸之路研究的重点和难点。它的历史建构更需要依赖域外东西方史料。《丝路视域》第二章第二节“四到六世纪欧亚丝路贸易中的波斯战争”使用了诸多拜占庭史家的文献记载，这些史家包括普罗柯比、米南德、苏格拉底（Socrates）、索佐门（Sozomenus）、阿米阿努斯·马塞林努斯（Ammianus Marcellinus）、佐西莫斯（Zosimus）。遗憾的是，中国史料在研究萨珊波斯帝国具体的历史问题上帮助较少。
    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-12&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-13&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        阿瓦尔人是不是柔然人一直在学界存在争议。《丝路视域》根据东西方史料、史实和前人研究成果，提出了自己的观点。“对于阿瓦尔人的族属问题，认为阿瓦尔人是被突厥击溃的柔然人的这一观点曾在中外史学界中占据主导地位。笔者认同余太山先生的研究成果，即阿瓦尔人是《魏书·西域传》中的‘悦般’人……本文所论的阿瓦尔人是由中亚西迁到欧洲的伪阿瓦尔人。在558年突厥消灭嚈哒前后，曾被西突厥征服的Ogor人西迁到高加索时，被当地民族误以为是可怕的阿瓦尔人，Ogor遂以阿瓦尔人自居，即迁到东欧的伪阿瓦尔人。”（136页）当然辨析阿瓦尔人的族源问题不是该书的重点，如果进一步研究阿瓦尔人的族源则需要探寻乌戈尔人（Ogor）的历史，并且基于历史记载中的柔然、阿瓦尔人、乌戈尔人的情况予以专业分析。这种分析是基于史实、研究者的思辨能力、研究者所具备的东西贯通的视域和知识广度才能达到的高度。罗三洋对匈奴和匈人的辨析是这方面的杰出代表（《哥特史》，译者序ⅵ-ⅻ页）。
    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-13&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-14&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        总之，研究者只有在充分了解史实的基础上才能准确理解史料。这应该是史料批判中的应有之义。同时研究者熟悉书写对象国的史实才能更准确地判断古人史料的价值和缺陷，超越前人由于时代局限造成的历史解释的不足，推动学术研究发展到新的阶段。这个层面的意义对于丝绸之路研究更为重要。因为东西方史料对于丝绸之路上的诸多内容记载是零散、模糊的，相比于记载本国的历史，其准确性值得怀疑。而传统研究丝绸之路的专家由于近现代教育的局限，其学识局限在特定的中国史、汉学、拜占庭史等国家或者文明的框架之内，即使身为西方人的汉学家，由于学业有专攻，对西方古典和中世纪历史的深层次认知仍有一定的局限。而研究者对于萨珊波斯帝国和阿拉伯帝国历史的认知水平仍旧有足够大的提升空间。所以东西方史实知识贯通是研究丝绸之路的未来发展方向的重要内容。丝绸之路研究要重视史实的重要性，在史实贯通基础上才能更准确地理解史料，形成合理的直觉认知，判断记载模糊的史料，形成相对合理的历史建构。
    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-14&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-15&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        《丝路视域》虽然没有开篇明义地提出用全球史的视角研究丝绸之路的相关问题，但是部分内容反映了一定的全球史视域。如第二章第三节中的“匈人对拜占庭内的侵掠与欧亚丝路贸易体系的物资流动”中，作者从黄金、丝绸、珍宝等奢侈品的角度解析匈人与拜占庭帝国的关系，透析了游牧民族侵掠行为背后的经济动机。作者指出“阿提拉所建的匈人帝国，是依靠阿提拉个人征战的权威、掠夺分配黄金等丝路硬通货以及联姻纽带等方式。将西罗马和拜占庭帝国周边匈人、图林根人、哥特人、格庇德人、苏维汇人、赫鲁勒人、萨尔马提亚人和阿兰人等中东欧众多蛮族，强制扭结在一起的蛮族共同体”。另外第三章第一节的“嚈哒丝路扩张对欧亚陆路丝路主要国家关系的影响”也在一定程度上带有全球史的视角。嚈哒人在中亚的活动影响了萨珊波斯帝国的内部皇室斗争和外部活动。最著名的事件是普罗柯比记载的历史：当查士丁尼的军队在意大利获得战果之际，东哥特使者前往萨珊波斯帝国宫廷，希望能够与波斯人结成同盟。波斯人利用拜占庭帝国用兵西部之际，趁虚而入入侵叙利亚等地，然而由于受到东方的嚈哒人的威胁压力，波斯人不得不撤军。嚈哒人摧毁波斯军队导致萨珊波斯帝国削弱，一定程度上有利于拜占庭帝国，使其能够更专注于意大利战场。而嚈哒人获胜的原因之一是其擅长的一种战术。嚈哒人的战术影响到嚈哒与萨珊波斯帝国的胜负关系，进而影响到萨珊波斯帝国对拜占庭帝国的军事压力，再影响到拜占庭帝国与东哥特王国的战事。从中亚到西部地中海地区形成了一种全球史的联动关系。
    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-15&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;
&lt;h3 id=&#34;彭凯翔评胡岳峰遗著一两知秋清代货币市场的晴雨表&#34;&gt;彭凯翔评胡岳峰遗著︱一“两”知秋：清代货币市场的“晴雨表”
&lt;/h3&gt;&lt;div class=&#34;note-card&#34;&gt;
    &lt;div class=&#34;nc-accent&#34;&gt;&lt;/div&gt;

    &lt;div class=&#34;nc-header&#34;&gt;
        &lt;div class=&#34;nc-meta&#34;&gt;
            &lt;span class=&#34;nc-badge&#34;&gt;READING&lt;/span&gt;
            &lt;span class=&#34;nc-date&#34;&gt;2025-10-19&lt;/span&gt;
        &lt;/div&gt; &lt;a href=&#34;https://www.thepaper.cn/newsDetail_forward_31770790&#34; target=&#34;_blank&#34; class=&#34;nc-title&#34; title=&#34;访问原文&#34;&gt;
            彭凯翔评胡岳峰遗著︱一“两”知秋：清代货币市场的“晴雨表”
            &lt;svg class=&#34;nc-link-icon&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
        &lt;/a&gt;
    &lt;/div&gt;

    
    &lt;div class=&#34;nc-context&#34;&gt;
        &lt;div class=&#34;nc-quote-icon&#34;&gt;“&lt;/div&gt;
        &lt;div class=&#34;nc-summary-text&#34;&gt;这篇书评讨论了胡月峰的遗作，这是一部对清代中国银铜兑换率波动进行全面研究的著作。该书细致地收集和分析了历史数据，深入探讨了当时的经济状况，包括市场一体化、国家管理以及波动对日常生活的影响。评论者着重强调了该书对理解货币体系、市场动态的贡献，并为未来的研究者提出了挑战。&lt;/div&gt;
    &lt;/div&gt;
    

    
    
    
&lt;/div&gt;

&lt;style&gt;
     
    .note-card {
         
        --nc-bg-card: #ffffff;
        --nc-border: rgba(0,0,0,0.04);
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.08);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.12);
        
        --nc-title: #2c3e50;
        --nc-title-hover: #3a7bd5;
        --nc-meta: #999999;
        
        --nc-bg-context: #f8f9fa;
        --nc-border-context: #e2e8f0;
        --nc-quote-icon: #e2e8f0;
        --nc-text-summary: #555555;
        
        --nc-label-bg: #ffffff;
        --nc-label-text: #2d3748;
        --nc-content-text: #2d3748;
        --nc-link-icon: #cbd5e0;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.1);
        --nc-badge-text: #3a7bd5;

        position: relative;
        background: var(--nc-bg-card);
        border-radius: 12px;
        box-shadow: var(--nc-shadow);
        margin: 2.5rem 0;
        overflow: hidden;
        border: 1px solid var(--nc-border);
        font-family: inherit; 
        transition: transform 0.3s ease, box-shadow 0.3s ease, background 0.3s, border-color 0.3s;
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .note-card {
            --nc-bg-card: #1e1e1e;
            --nc-border: #333333;
            --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
            --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
            
            --nc-title: #f0f0f0;
            --nc-meta: #999999;
            
            --nc-bg-context: #252525;
            --nc-border-context: #444444;
            --nc-quote-icon: #333333;
            --nc-text-summary: #aaaaaa;
            
            --nc-label-bg: #1e1e1e;
            --nc-label-text: #cccccc;
            --nc-content-text: #dddddd;
            --nc-link-icon: #666666;
            
            --nc-badge-bg: rgba(58, 123, 213, 0.2);
        }
    }

    html[data-scheme=&#34;dark&#34;] .note-card {
        --nc-bg-card: #1e1e1e;
        --nc-border: #333333;
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
        
        --nc-title: #f0f0f0;
        --nc-meta: #999999;
        
        --nc-bg-context: #252525;
        --nc-border-context: #444444;
        --nc-quote-icon: #333333;
        --nc-text-summary: #aaaaaa;
        
        --nc-label-bg: #1e1e1e;
        --nc-label-text: #cccccc;
        --nc-content-text: #dddddd;
        --nc-link-icon: #666666;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.2);
    }

    .note-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--nc-shadow-hover);
    }

     
    .nc-accent {
        height: 4px;
        background: linear-gradient(90deg, #3a7bd5, #00d2ff); 
        width: 100%;
    }

     
    .nc-header {
        padding: 24px 28px 10px; 
    }

    .nc-meta {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 10px; 
        font-size: 13px; 
        color: var(--nc-meta);
        font-weight: 600;
        letter-spacing: 1px;
        text-transform: uppercase;
    }

    .nc-badge {
        color: var(--nc-badge-text);
        background: var(--nc-badge-bg);
        padding: 2px 6px;
        border-radius: 4px;
    }

    .nc-title {
        display: block;
        font-size: 2rem; 
        font-weight: 700;
        color: var(--nc-title);
        text-decoration: none;
        line-height: 1.3;
        transition: color 0.2s;
    }

    .nc-title:hover {
        color: var(--nc-title-hover);
    }

    .nc-link-icon {
        width: 20px; 
        height: 20px;
        color: var(--nc-link-icon);
        margin-left: 5px;
        vertical-align: middle;
        transition: color 0.2s;
    }

    .nc-title:hover .nc-link-icon {
        color: var(--nc-title-hover);
    }

     
    .nc-context {
        margin: 12px 28px 24px;
        background: var(--nc-bg-context);
        padding: 20px 24px;
        border-radius: 8px;
        position: relative;
        border-left: 4px solid var(--nc-border-context);
        transition: background 0.3s, border-color 0.3s;
    }

    .nc-quote-icon {
        position: absolute;
        top: 8px;
        left: 10px;
        font-family: serif; 
        font-size: 40px;
        line-height: 1;
        color: var(--nc-quote-icon);
        pointer-events: none;
        transition: color 0.3s;
    }

    .nc-summary-text {
        font-size: 1.7rem; 
        color: var(--nc-text-summary);
        line-height: 1.6;
        font-style: italic;
        position: relative;
        z-index: 1;
        padding-left: 15px; 
        transition: color 0.3s;
    }

     
    .nc-body {
        padding: 0 28px 32px;
        position: relative;
    }

     
    .nc-label {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        font-size: 13px; 
        font-weight: 700;
        color: var(--nc-label-text);
        background: var(--nc-label-bg);
        padding-right: 10px;
        margin-bottom: 12px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
        transition: color 0.3s, background 0.3s;
    }

    .nc-content {
        color: var(--nc-content-text);
        font-size: 1.6rem; 
        line-height: 1.75;
        transition: color 0.3s;
    }

     
    .nc-content p { margin-bottom: 1em; }
    .nc-content p:last-child { margin-bottom: 0; }
    
    .nc-content ul { padding-left: 20px; color: inherit; }
    .nc-content li { margin-bottom: 6px; }
&lt;/style&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-17&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        自彭信威先生的《中国货币史》以来，学界关于清代的银钱比价已有不少探讨，但与其重要性相比，现有研究还远远不够。尤其是基础数据的不系统，大大限制了研究的深入。现在，本书作者克服资料收集的种种困难，将清代银钱比价予以尽可能全面的整理和解读，填补了这一领域的空白，令人钦敬。同时，出版方对作者的研究给予了尽可能完善的呈现，其诚意也令人赞叹。例如，本书正文中的图表均采用了彩色印刷，使得价格序列间的异同、货币实物的细微之处等都清晰可辨，为国内一般的学术出版物所难以企及。而且，本书不计篇幅，将一些在其他出版物中只是节略引用的重要史料予以完整呈现，非常便于读者原汁原味地体会相关的历史背景。所以，本书亦是对货币史的献礼，不仅适合专业学者参考，也适合对货币史感兴趣的读者阅读。
    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-17&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-18&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        本书的首要贡献是银钱比价数据整理的范围大大超过前人，在整合已有研究的基础上，构建了清代银钱比价的分省年度序列。在数据整理过程中，作者对史料的性质进行了考辨，区分了铸造成本比价、官定搭放价、赋税折征价、官卖价、市场价等属性，并将纷繁的货币单位尽可能地统一到库平纹银与足制钱上来，最终以市场价为基本口径建立起具有可比性的序列，以反映清代银钱货币市场的波动（第一至三章）。受限于资料，本书呈现的数据在时空分布上仍不均匀。其中，十八世纪初以前各省的比价颇为稀零，云、贵、甘肃等省份的数据缺失较多，东北的数据作者应有整理，但未列在数据表中（301页）。尽管如此，清代银钱比价波动的概貌已经可以从数据中反映出来了。将来的学者在处理经济史料，需要换算货币单位时，也不难按表索骥，查得基本可靠的参考价格。
    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-18&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-19&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        在数据来源上，本书除利用前人研究外，更广泛发掘官方档案以及方志、文集、报刊、账簿等非官方史料。同时，如作者所述，“官方档案数据是本书主要依赖的数据”（48页）。具体而言，地方向中央奏报的比价是本书所依赖的核心史料。清代奏报粮价已为学界所熟知，由王业键先生领衔的台湾“中研院”近史所团队与中国社科院经济所先后整理发布的两套清代粮价数据更是被广为引用。清廷虽然也希望官员一并奏报银钱比价，但银钱比价奏报的完整度远不如粮价，爬梳的难度则更上一层，所以没有得到与粮价同等的重视。加之中间有一段时间档案处于整理状态，学者利用不便，亦限制了银钱比价奏报档的开发。近年第一历史档案馆的查档环境虽有所改善，相关档案也已扫描为电子图片，可是仍需在馆内电脑上查阅，对外地学者颇为不便。本书作者并不居京，但仍以一己之力，对第一历史档案馆的银钱比价奏报档进行了充分的收集整理，将数据公之于众，省却后来者无数劳动，可谓善莫大焉！
    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-19&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-20&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        当然，作为同行，在本书的字里行间似乎也读出了些许无奈，不能不有戚戚焉。一方面，官方档案在时间和空间跨度上的确是非官方史料所难匹敌的，但账簿等商业文书在数据的精确性、连续性方面则较胜一筹，集腋成裘，亦甚可观。然而，商业文书近年虽大量涌现，其主体仍然分散于各收藏机构及藏家。即使是公藏机构的文书，或因归于抄本古籍，或因封存库房，往往缺乏透明的查阅政策，外人利用甚难。本书对商业账簿的利用主要取之于已有研究以及已公开出版者（286页），不能不说是一种遗憾。另一方面，本书所利用的官方档案主要是奏折，但还有一大宗档案未得到系统利用，即刑科题本。刑科题本是刑科给事中汇缴大内的一种司法文书，包含了货币、物价、工资、利率、生产生活关系等丰富的社会经济活动信息，素来是清代社会经济史研究的宝库。然而，刑科题本有数十万卷之巨，第一历史档案馆过去只开放了“土地债务”和“婚姻奸情（家庭）”两个专题卷宗，先后有数个团队据此耕耘，也只能是取其一瓢而已。近年开放的刑科题本卷数大大增加，但利用条件则如故。对有志于清代社会经济史的研究者而言，如何能充分发掘这座宝库，始终是横亘心头的一道难题吧。
    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-20&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-21&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        数据来源也会影响到数据整理的方式。本书将数据分省、分年进行整理，既是因为史料分布不均，在比省和年更细的尺度上，数据将过于零碎，也是因为官方档案等史料中的数据有时本身就是概述性的，难以精确到更细的时空尺度上。不过，如果银钱比价在省内各地或一年内的各个季度间存在较大差异，将并不整齐的数据分省、分年平均取值，就可能会带来偏差。在数据较多的情形下，这不太会影响我们对基本趋势的判断，但有可能影响到我们对银钱比价波动的一些具体解释，也可能会不便于读者选取数据来处理较细时空尺度下的经济史料。尤其是对于账簿等民间文书中的记录，它并不是按年或日这样的固定频率形成的，而是交易级别的，能反映交易主客体对比价的影响。一旦转化为固定频率的序列，就会损失掉这些弥足珍贵的信息。本书序言中提到作者建立了一个“数百万字的原始数据库”（第4页），也即还有一个包含原始时间、地点等信息的底层数据库与本书配套，只是它难以用出版物来呈现。期待将来它能以合适的形式开放出来，与本书一道嘉惠学林，相信这也是作者的志之所在。
    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-21&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-22&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        &lt;p&gt;一旦建立了各省的银钱比价年度序列，并将它们放在一起比较，我们就会得到和作者类似的判断——“清代银钱比价自始至终在总体上存在一个全国性市场，全国意义上市场的整合不是有与无的问题，而是程度高与低的问题”（363页）。这有力支持了以往基于银钱比价定量研究的发现，同时也挑战了文献中以定性为主的研究所作出的论断。后者主要是基于各地货币的不统一来论述货币市场的分割，如魏建猷先生的《中国近代货币史》更将其归结为与社会性质相联的“封建的区域性”（29页、63页）。另一种思路则将地域性货币单位理解为停滞于本地流通或“不回流”的地域货币的形成，这就是黑田明伸先生在《货币制度的世界史》中所提出的“自律性的本地通货”命题。&lt;/p&gt;
&lt;p&gt;然而，如果协调地域货币单位的组织与产生银钱交易行市的组织是合一的市场组织，那么，它实质上仍是以降低交易成本的方式来促进市场整合的组织，而非以分割市场来维持本地通货流通的组织。在这一过程中，地域货币单位的产生是以稳定的虚货币为价值尺度，来解决实货币的纷繁所带来的困扰，并不是要构造一种不能回流到跨地域流通的实货币。这时，尽管货币跨地域流通会有一定的交易成本，但如果将地域市场中的银钱比价单位统一换算为库平纹银与足制钱的比价，各地比价的波动就会变得非常接近，而不是像近代来华的外国旅行者所乍看到的那样莫衷一是了。本书的工作充分说明了这一点。&lt;/p&gt;
&lt;p&gt;在反映跨地域货币流通的活跃上，最鲜活的例子莫过于王棨华《达亭老人遗稿》中的一则记载。据载，乾隆末年有定州钱铺商人携银赴外地采购粮食，从邸报得知朝廷因银钱比价过高，有发银干预之议，于是紧急改往保定钱铺卖银买钱，结果又引发保定钱商往定州跟风交易，政策尚未出，银价骤减。这则材料虽然有文学化的成分，却颇能揭示专业钱商在地区间进行银钱套利的敏锐以及银钱交易因采用批帖等金融工具而变得便捷。最早注意到它的当属彭信威先生，但就像《中国货币史》很多耐人寻味的注脚那样，这则在文后节引的史料并未引起学界足够的重视。本书将它在正文中完整披露和解读（512-513页），很有助于读者体味到底什么才是清代货币市场的实态。当然，作者用该例来说明影响铜钱价值的十因素之第九个因素“投机及预期”，或有斟酌余地。“投机及预期”对应的行为即“套利”，套利机制正是市场价格调节资源配置的核心。本书详尽梳理了影响银钱供求的各方面因素，而如前例中政策干预通过钱商套利提前实现其目标所示，这些因素如果要通过市场主体来作用于银钱比价的话，就离不开套利机制。所以，“投机及预期”如果不是视为一种并列的因素，而是作为影响其他因素发挥其作用的一种机制来分析，似更为妥当。&lt;/p&gt;
&lt;p&gt;有必要一提的是，专业的银钱市场集中于城市，官员奏报也更可能参考治所驻地的情形，这些都意味着目前的银钱比价数据是偏向于城市的。然而，农村的货币流通有别于城市。一则农村的货币交易规模较小，行用铜钱为主，所以难以形成银钱兑换的行市；二则农村的货币流通速度较慢，会向“不回流”的本地通货一端倾斜。不过，除了一些代用货币或信用票据，农村货币的基础——铜钱仍然有赖于城市的供应。商人的规程书揭示了长距离贸易商人运送铜钱到农村采购的情形，而官方办理基层赈济时，也需要以银易钱发放。这样，银钱比价对于理解城乡间的货币流通及市场整合依然是非常关键的。只是在这一流通中，外地商人与本地乡民间的交易成本是极不对称的，这会带来和城市之间的市场整合很不一样的情形。应该承认，我们目前对此仍知之甚少。事实上，作者在关于石仓文书的合作研究中已开始涉足于此，今后随着更多的农家账簿进入学者的研究视野，这一状况想必将会改观。&lt;/p&gt;

    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-22&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-23&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        在货币制度上，本书特别注意到清代“银一钱千”（即银一两合钱一千文）的设计，并结合历代货币文化进行阐述（第五章）。前人对此也有留意，但缺乏深入的解释。如彭信威先生只是简单地谈到清廷当时“不懂得主币和辅币的道理”，所以想维持一个固定的比价，乃至直接在钱背刻上“一厘”（即千分之一两）字样。作者则提出一文钱与一厘银的固定比例观念与一文钱重一钱的传统有关，反映了传统货币理念中计数与计重间的通融。从演化的角度来看，货币与语言类似，其扩散都有赖于使用者的共同认知，有很强的路径依赖属性，以观念或文化传统为解释是合理的。可以补充的是，一文钱重一钱不仅仅是对计数的铜钱赋予计重的含义，而且，制钱本身也会作为重量标准来使用。大一统王朝虽然重视度量衡的标准化，但以当时的技术施之于一个广土众民的国家，标准度量衡器具往往并不易得，这时制钱就是最现成的一种衡器。所以，制钱或许本身就内含计重属性，一文钱重一钱不仅反映了货币传统，其与度量衡传统的关系也值得留意。
    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-23&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-24&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        作者的讨论不仅关注国家，也同样结合新出的史料关注银钱比价波动对民间的影响及其应对，包括对“道光萧条”、咸丰铸大钱等清代经济史中比较经典的问题进行了分析。本书的探讨表明，只有将物价、工资、利率等数据与银钱比价放在一起分析，才能厘清货币市场波动对民众生活、商业往来等方面的影响。目前我们能看到的数据还是比较初步的，但不排除将来在某些商业账簿资料比较丰富的地区，能对这些问题做比较精细的研究。在本书中，作者基于商业文书提出的新问题是，面对银钱比价的波动，财务上应如何处理？由于传统账簿中对每一项货币收支不仅按记账货币记录了其价值，也像普通商品那样记录了每种实货币的数量，所以财务人员直接干没钱财是不容易的，但在银钱比价不断波动的情形下，其仍可通过对银钱比价的选择来操纵损益的核算，从而影响分红。果如此的话，应如何解读账簿中的银钱比价，又如何理解最终计算出来的损益？更进一步，就像在史料中时有看到的那样，某些低劣的实货币甚至会崩盘、退出流通，这时又要通过什么比价来结清往来主体间的财务关系？对于后一情形，我们或许可凭对史料的感觉推知地方政府会出面与绅商协调，共同整理货币秩序，但关于这样一种超出刑名、钱粮的新现象，具体研究则是阙如的。这些都是本书留给我们的重要问题和研究启示。
    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-24&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;
&lt;h3 id=&#34;陈晋评重写灵魂记忆政治的诞生心理学在治愈我们还是定义我们&#34;&gt;陈晋评《重写灵魂》｜记忆政治的诞生：心理学在治愈我们，还是定义我们？
&lt;/h3&gt;&lt;div class=&#34;note-card&#34;&gt;
    &lt;div class=&#34;nc-accent&#34;&gt;&lt;/div&gt;

    &lt;div class=&#34;nc-header&#34;&gt;
        &lt;div class=&#34;nc-meta&#34;&gt;
            &lt;span class=&#34;nc-badge&#34;&gt;READING&lt;/span&gt;
            &lt;span class=&#34;nc-date&#34;&gt;2025-10-19&lt;/span&gt;
        &lt;/div&gt; &lt;a href=&#34;https://www.thepaper.cn/newsDetail_forward_31713328&#34; target=&#34;_blank&#34; class=&#34;nc-title&#34; title=&#34;访问原文&#34;&gt;
            陈晋评《重写灵魂》｜记忆政治的诞生：心理学在治愈我们，还是定义我们？
            &lt;svg class=&#34;nc-link-icon&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
        &lt;/a&gt;
    &lt;/div&gt;

    
    &lt;div class=&#34;nc-context&#34;&gt;
        &lt;div class=&#34;nc-quote-icon&#34;&gt;“&lt;/div&gt;
        &lt;div class=&#34;nc-summary-text&#34;&gt;“重塑灵魂”探讨了“记忆政治”的诞生，心理学是如何塑造我们对自我的理解的。它分析了19世纪的精神病学如何通过记忆重新定义自我，创造了“多重人格”等新类别。这本书认为，这些由叙事和科学框架推动的类别，塑造了我们理解和处理创伤的方式。它强调了记忆的政治维度，尤其是在身份政治方面，并敦促我们批判性地反思用于理解我们自己的语言。&lt;/div&gt;
    &lt;/div&gt;
    

    
    
    
&lt;/div&gt;

&lt;style&gt;
     
    .note-card {
         
        --nc-bg-card: #ffffff;
        --nc-border: rgba(0,0,0,0.04);
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.08);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.12);
        
        --nc-title: #2c3e50;
        --nc-title-hover: #3a7bd5;
        --nc-meta: #999999;
        
        --nc-bg-context: #f8f9fa;
        --nc-border-context: #e2e8f0;
        --nc-quote-icon: #e2e8f0;
        --nc-text-summary: #555555;
        
        --nc-label-bg: #ffffff;
        --nc-label-text: #2d3748;
        --nc-content-text: #2d3748;
        --nc-link-icon: #cbd5e0;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.1);
        --nc-badge-text: #3a7bd5;

        position: relative;
        background: var(--nc-bg-card);
        border-radius: 12px;
        box-shadow: var(--nc-shadow);
        margin: 2.5rem 0;
        overflow: hidden;
        border: 1px solid var(--nc-border);
        font-family: inherit; 
        transition: transform 0.3s ease, box-shadow 0.3s ease, background 0.3s, border-color 0.3s;
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .note-card {
            --nc-bg-card: #1e1e1e;
            --nc-border: #333333;
            --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
            --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
            
            --nc-title: #f0f0f0;
            --nc-meta: #999999;
            
            --nc-bg-context: #252525;
            --nc-border-context: #444444;
            --nc-quote-icon: #333333;
            --nc-text-summary: #aaaaaa;
            
            --nc-label-bg: #1e1e1e;
            --nc-label-text: #cccccc;
            --nc-content-text: #dddddd;
            --nc-link-icon: #666666;
            
            --nc-badge-bg: rgba(58, 123, 213, 0.2);
        }
    }

    html[data-scheme=&#34;dark&#34;] .note-card {
        --nc-bg-card: #1e1e1e;
        --nc-border: #333333;
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
        
        --nc-title: #f0f0f0;
        --nc-meta: #999999;
        
        --nc-bg-context: #252525;
        --nc-border-context: #444444;
        --nc-quote-icon: #333333;
        --nc-text-summary: #aaaaaa;
        
        --nc-label-bg: #1e1e1e;
        --nc-label-text: #cccccc;
        --nc-content-text: #dddddd;
        --nc-link-icon: #666666;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.2);
    }

    .note-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--nc-shadow-hover);
    }

     
    .nc-accent {
        height: 4px;
        background: linear-gradient(90deg, #3a7bd5, #00d2ff); 
        width: 100%;
    }

     
    .nc-header {
        padding: 24px 28px 10px; 
    }

    .nc-meta {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 10px; 
        font-size: 13px; 
        color: var(--nc-meta);
        font-weight: 600;
        letter-spacing: 1px;
        text-transform: uppercase;
    }

    .nc-badge {
        color: var(--nc-badge-text);
        background: var(--nc-badge-bg);
        padding: 2px 6px;
        border-radius: 4px;
    }

    .nc-title {
        display: block;
        font-size: 2rem; 
        font-weight: 700;
        color: var(--nc-title);
        text-decoration: none;
        line-height: 1.3;
        transition: color 0.2s;
    }

    .nc-title:hover {
        color: var(--nc-title-hover);
    }

    .nc-link-icon {
        width: 20px; 
        height: 20px;
        color: var(--nc-link-icon);
        margin-left: 5px;
        vertical-align: middle;
        transition: color 0.2s;
    }

    .nc-title:hover .nc-link-icon {
        color: var(--nc-title-hover);
    }

     
    .nc-context {
        margin: 12px 28px 24px;
        background: var(--nc-bg-context);
        padding: 20px 24px;
        border-radius: 8px;
        position: relative;
        border-left: 4px solid var(--nc-border-context);
        transition: background 0.3s, border-color 0.3s;
    }

    .nc-quote-icon {
        position: absolute;
        top: 8px;
        left: 10px;
        font-family: serif; 
        font-size: 40px;
        line-height: 1;
        color: var(--nc-quote-icon);
        pointer-events: none;
        transition: color 0.3s;
    }

    .nc-summary-text {
        font-size: 1.7rem; 
        color: var(--nc-text-summary);
        line-height: 1.6;
        font-style: italic;
        position: relative;
        z-index: 1;
        padding-left: 15px; 
        transition: color 0.3s;
    }

     
    .nc-body {
        padding: 0 28px 32px;
        position: relative;
    }

     
    .nc-label {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        font-size: 13px; 
        font-weight: 700;
        color: var(--nc-label-text);
        background: var(--nc-label-bg);
        padding-right: 10px;
        margin-bottom: 12px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
        transition: color 0.3s, background 0.3s;
    }

    .nc-content {
        color: var(--nc-content-text);
        font-size: 1.6rem; 
        line-height: 1.75;
        transition: color 0.3s;
    }

     
    .nc-content p { margin-bottom: 1em; }
    .nc-content p:last-child { margin-bottom: 0; }
    
    .nc-content ul { padding-left: 20px; color: inherit; }
    .nc-content li { margin-bottom: 6px; }
&lt;/style&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-26&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        &lt;p&gt;历史的吊诡往往隐藏在地名深处。我曾经长居于巴黎南郊的克里姆林-比塞特（Le Kremlin-Bicêtre），当时只觉得这个复合地名颇为别致，却从未追究其来历。直到读罢加拿大哲学家伊恩·哈金的《重写灵魂：多重人格与记忆科学》，我才意识到这个不起眼的小镇原来是知识考古学的核心现场之一。“Bicêtre”源自中世纪温彻斯特（Winchester）主教兴建的城堡，后改为医院；“Kremlin”之名则来自1812年拿破仑从莫斯科撤退后、幸存法军频繁光顾的一间小酒馆。两段看似风马牛不相及的历史记忆被压缩、封存在一个地名中并沿用至今，这正是“记忆层叠”的生动写照。&lt;/p&gt;
&lt;p&gt;比塞特医院（Hôpital Bicêtre）承载着法国精神医学的发展史——从十七世纪路易十四时期关押疯人的收容所，到十八世纪菲利普·皮内尔（Philippe Pinel）解除精神病人镣铐的人道主义革命，再到十九世纪末成为神经学研究的前沿阵地。1883至1885年期间，路易·维韦（Louis Vivet）就是在这里被诊断为历史上第一个拥有多重人格（Multiple Personality）的病例。神经学权威让-马丁·沙尔科（Jean-Martin Charcot）的学生朱尔·瓦赞（Jules Voisin）医生，记录了他监护下的维韦的奇特症状：这名二十岁的男子在“第一状态”下脾气暴躁、有攻击性；在“第二状态”下，他性格温顺、极为虔诚，但腰部以下全部瘫痪。随后，研究者报告维韦存在至少六种，多达十种不同的人格，每种人格伴随着截然不同的身体能力、记忆、性格和行为模式。患者人格之间的转换可以通过催眠、触摸特定身体部位或使用不同金属来诱发。&lt;/p&gt;

    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-26&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-27&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        &lt;p&gt;就在同一时期，沙尔科的另一名学生——显然是将来最著名的一位——年轻的弗洛伊德正在巴黎，忙于将老师的著作翻译成德语。彼时，沙尔科在萨尔佩特里埃医院（Salpêtrière）定期举办的“星期二讲座”（Leçons du mardi）已成为整个巴黎知识界的盛事，吸引了大量社会名流、艺术家、作家（如左拉和莫泊桑）、记者和政客参与，弗洛伊德也在其中。通过高度戏剧化的临床教学展示，沙尔科得以向同行和公众推广神经病理学的前沿研究，同时也树立了自己的绝对权威。多重人格无疑为这类活动提供了绝佳的素材：它既神秘得足以吸引社会关注，又足够“病理化”以证明医学干预的必要性。弗洛伊德早期的诱惑理论（Seduction Theory），以及后来对“压抑”和“无意识”的建构，很难说与这一时期的人格分裂研究毫无瓜葛。&lt;/p&gt;
&lt;p&gt;哈金敏锐地捕捉到了这一历史交汇点的深刻涵义。他意识到，从此刻开始，关于灵魂、自我和痛苦的道德与形而上学争论，开始转化为一套关于记忆和遗忘的、“客观”的科学知识体系。这种话语转换的革命性在于重新定义现代人理解自我的基本框架。哈金由此展开的思想之旅，揭示了我们今天用于讨论人性和应对创伤的话语体系，是如何在一个多世纪前被塑造、争夺和发明的。&lt;/p&gt;

    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-27&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-28&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        &lt;p&gt;《重写灵魂》不是一部按部就班的精神病学史。哈金的核心论旨是：十九世纪末兴起的“诸记忆科学”（Sciences of Memory）并非简单地“发现”了记忆的客观事实，而是创造了一整套新的词汇、概念和实践，目的是取代传统的“灵魂”观念，从而将人的内在世界全面纳入科学知识与权力治理的范畴。从此，灵魂不再是神学或形而上学的专属领地，它被“重写”为一系列关于记忆功能的、可被观察、测量和治疗的科学对象。在哈金看来，这种转变绝非偶然，而是一场深刻的知识型变革（epistemic transformation）的后果，它重构了人类理解自身精神生活的方式。&lt;/p&gt;
&lt;p&gt;为了论证这一点，哈金细致追溯了“多重人格”这一诊断类别的历史流变。他以十九世纪末法国的经典案例费莉达·X（Félida X）为起点，讲述了“人格的双重化”（doubling of the personality）如何在癔症和催眠术的温床中诞生，并追踪其如何漂洋过海，在美国演变为“多重人格”。二十世纪七十年代后，在里程碑式的案例“西碧尔”（Sybil，她拥有十六个分身，其中还包括两个异性人格，其故事被改编成影视作品）、女性主义运动和“童年创伤”等叙事的共同推动下，这一原本罕见的医学奇观爆发为一场席卷北美的“流行病”。最终，在1994年，美国精神医学学会的《精神障碍诊断与统计手册（第四版）》（DSM—IV）将其更名为“分离性身份障碍”（Dissociative Identity Disorder），目的是将该类别“再科学化”和“去戏剧化”。哈金指出，这一系列变迁伴随着知识框架、治疗实践、法律责任乃至社会价值的深度重组，历史的非连续性证明了现代精神医学分类的社会建构性。&lt;/p&gt;

    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-28&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-29&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        作为哲学家的哈金擅长理论思考，例如贯穿全书的“人类类别的循环效应”（looping effect of human kinds）。这是指人的科学中的类别并非简单描绘独立存在的现实，因为这些类别本身会与被分类的人群产生互动。例如，当“多重人格”这一标签被创造出来，它便为人们提供了一种新的、可被理解的表达内心痛苦的方式。这一循环效应的具体过程可以被拆解如下：
    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-29&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-30&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        &lt;p&gt;全书最引人注目的概念当属“记忆政治”（memoro-politics）。在哈金看来，这是继福柯的“解剖政治”（anatomo-politics，针对身体）和“生命政治”（bio-politics，针对人口）之后，针对主体的第三个权力极点。他认为，二十世纪末关于记忆的激烈争论——尤其是“恢复性记忆”（Recovered Memory）与“虚假记忆综合征”（False Memory Syndrome）——本质上是不同社会群体围绕权力、道德和“真相”展开的政治斗争：一方是女性主义者和治疗师，他们将恢复童年创伤记忆视为对父权制暴力的揭露，以及对幸存者的赋权；另一方则是“虚假记忆综合征基金会”所代表的、被指控的家庭成员和持怀疑态度的科学家，他们谴责这是一种由治疗师诱导、破坏家庭的“现代巫术”。这场论战的焦点在于记忆的可塑性。哈金准确地指出，争论远不止于科学事实的真伪，而是关系到法律诉讼的成败、家庭关系的存续、治疗师的职业合法性，以及女性主义运动的道德根基。&lt;/p&gt;
&lt;p&gt;哈金揭示了这场“记忆战争”的深层条件：无论是声称记忆可以被恢复的治疗师，还是强调记忆容易被篡改的心理学家，都接受了一个共同的前提，即记忆是通往真相的路径，是可以被科学研究和法律认定的客观对象。这种共识体现了十九世纪以来诸记忆科学的巨大成功：记忆从私人经验转移到了公共领域，成为专家知识和制度权力可以合法介入的对象。与此同时，记忆也成为了社会控制的工具，其真假判断不再由个体自己做出，而是需要诉诸专家权威和科学证据。&lt;/p&gt;
&lt;p&gt;哈金对现代记忆的两大趋向——科学化和叙事化——的剖析尤为精彩。十九世纪以来，记忆科学化的主要路线包括解剖学（以布罗卡对大脑功能定位的研究为标志）、统计学（以埃宾豪斯的实验心理学为标志）和心理动力学（以里博的记忆实证研究为标志）。但另一方面，记忆与“讲故事”（storytelling）密不可分。因为记忆并非简单地模仿或再现我们早期的经历，而是通过填补当下的空白和掩盖异常，使叙事保持连贯性。这两种趋向看似对立，实际上有着共同的根源：它们都是对传统灵魂概念的世俗化替代。科学的记忆研究试图用客观的、可测量的数据来解释主观性；叙事的记忆理论则试图用故事的形式来重新捕获灵魂的丰富性。在此意义上，普鲁斯特的名著《追忆似水年华》可以被视为对第一波法国科学主义记忆政治的人文主义回应。&lt;/p&gt;

    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-30&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-31&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        &lt;p&gt;《重写灵魂》是哈金长期学术关怀的结晶。在另一部重要著作《疯狂旅行者》（Mad Travelers）中，他考察了“神游症”（fugue）的兴衰。这种无法控制的、伴有遗忘的漫游冲动曾经在十九世纪末的法国短暂流行，并拥有一套完整的医学解释，但到了第一次世界大战后便销声匿迹。哈金认为，神游症的出现需要特定的“生态位”（ecological niche），包括发达的铁路网络、对流浪者的社会恐慌、国家对人口流动的监控需求（如身份证明文件的普及），以及新兴的神经病学权威，等等。一旦生态位消失，这种疾病也就随之消亡。那么，多重人格的生态位是什么？在二十世纪后期的北美社会中，鼓励自我表达和自我探索的治疗文化、女性主义运动对“说出你的创伤”的政治倡导、媒体对奇观化案例的追捧，以及法律体系开始承认基于恢复性记忆的诉讼等，这些元素共同构成了多重人格的土壤。两个案例充分展示了精神疾病的存在与历史条件和社会网络密不可分。&lt;/p&gt;
&lt;p&gt;将神游症与多重人格并置，有助于更好地理解上百年来欧洲与北美的社会变迁和知识图景。它们如同硬币的两面，折射出现代性危机的不同表达：神游症几乎是男性的专利——这些城市中的职业男性在某个瞬间抛下一切，开始横跨欧洲的无意识漫游，他们的身体在公共空间中自由穿行，却对整个过程毫无记忆；多重人格则成为女性的领地，十分之九的患者都是女性，她们的身体被禁锢在私人空间中，只能通过内在人格的分裂来获得某种心理上的流动性。这种性别分布精确地反映了传统的空间分配：男性拥有外部世界的行动权，女性则被限制在内在世界中，她们的反抗也只能是向内的。实际上，我们可以将它们看作是同一事物的两个名字，正如哈金所说，“男性的多重人格患者在哪？……一个简单的答案——他们人在旅途”。&lt;/p&gt;
&lt;p&gt;神游症与多重人格都是典型的“世纪末”（fin de siècle）症候，在历史的转折点上爆发，承载着一个时代的集体焦虑。十九世纪末的神游症伴随着现代交通工具的普及和旅游业的兴起，体现了工业社会对传统地域束缚的突破，也暴露了现代人在急剧变化的世界中失去方向感的困境。二十世纪末北美多重人格的流行则与女性主义运动、儿童权利保护和创伤心理学的兴起密切相关，折射出后现代社会中的身份认同危机。&lt;/p&gt;
&lt;p&gt;更进一步地，神游症与多重人格的出现，都与记忆被“科学化”的过程密不可分。神游症是实证科学的理想研究对象。患者主观上声称记忆完全丧失，这就为医生、警察和法官等权威角色提供了一个绝佳的舞台。他们可以通过搜集客观证据——比如车票、旅店账单和目击者证词——来重建患者的真实轨迹，从而确立凌驾于个人主观体验之上的科学真理。相比之下，多重人格的记忆重建发生在精神病院和诊所的封闭空间内。它不再是外部证据的拼凑，而是通过催眠等技术对主体内在世界的干预和挖掘。在这个过程中，患者与治疗师之间形成了复杂的互动，记忆的恢复带有强烈的表演性，患者在治疗师的引导下学会如何呈现不同的人格和相应的创伤记忆。两者的差异反映了记忆科学化的两种路径：前者通过物质痕迹的客观重构来弥补记忆的空白，后者则通过主观体验的戏剧化表达来填补裂隙。&lt;/p&gt;
&lt;p&gt;哈金的思想与福柯有着显而易见的亲缘关系。他继承了福柯的知识考古学方法，追问话语、权力和身体如何塑造现代主体。然而，哈金也自觉地与福柯保持距离。如果说福柯的权力分析往往是“自上而下”的，描绘一个巨大、匿名的权力—知识网络，哈金则更关注“自下而上”的维度，赋予个体更多的能动性（agency）。他让我们看到，科学分类不仅仅是规训，也是个体用以理解自我、表达痛苦，甚至反抗命运的资源。人们会主动地借用、协商甚至改造这些标签，来重塑自己的身份认同。从这个角度来看，哈金不仅是福柯思想的延伸，也与拉图尔（Bruno Latour）遥相呼应。哈金用以解释疾病兴衰的“生态位”，实际上就是一个由异质性元素构成的行动者网络。无论是神游症还是多重人格，它们的实在性都不是源于某种生物学本质，而是由基础设施、报纸媒体、医学权威、法律判决、患者自述等人类与非人行动者组成的网络所支撑。一旦网络中的某个关键节点（如铁路旅行的新鲜感、媒体或公众的猎奇、主流科学研究范式）发生变化，整个网络就会松动，“疾病”也就随之衰退。&lt;/p&gt;

    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-31&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-32&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        &lt;p&gt;《重写灵魂》自问世以来，在哲学、历史学、社会学及精神病理学等多个领域激起了广泛回响。评论界普遍赞誉此书的博学、智识上的原创性及其处理复杂议题时的审慎态度。然而，学者也针对其历史解释、文化分析等问题展开了商榷与批判。有研究者指出，哈金过度聚焦于十九世纪末法国的精神医学史，却对二十世纪的历史创伤——特别是大屠杀——保持着令人惊讶的沉默。这种遗漏反映了某种研究视角上的局限。如果我们把创伤记忆仅仅理解为精神医学概念的演进史，就有可能忽略真实的历史灾难如何从根本上重塑了西方的创伤观念。&lt;/p&gt;
&lt;p&gt;哈金的分析或许还存在另一重局限。有人类学家指出，哈金对文化的理解停留在表面，他没有深入探讨法国天主教传统中关于灵魂与肉体二元性的独特理解，或启蒙运动对理性主体的特殊建构。更为关键的是，哈金忽视了不同文化中关于人格的多样化理解。在许多非西方文化中，人格的多重性和流动性被视为常态而非病态，例如灵魂可以暂时离开身体，个体可以被祖先或神灵附体，这些都指向与西方截然不同的自我观念。如果将视野扩展到这些文化传统，我们不难发现，多重人格在西方的流行和衰退恰恰暴露了特殊文化建构的内在脆弱性。&lt;/p&gt;

    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-32&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-33&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        &lt;p&gt;当代中国的心理学热潮发生在一个独特的历史时刻：传统的集体主义价值观与个体化进程激烈碰撞，代际创伤的记忆与遗忘相互纠缠，现代性的承诺与现实的落差日益明显。在这样的语境中，年轻一代用新的方式解释自己与父母、恋人、朋友、同事的关系，尝试重新定义什么是“正常”的情感表达，想象什么样的生活值得过。然而，正如哈金所警示的那样，这种“科学+叙事”的自我理解模式本身就是历史的产物，既解放了我们，也可能束缚我们。当复杂的人生经历被归因为“原生家庭创伤”，个体的挣扎被简化为某种特定的“人格类型”，我们在获得一种解释的确定感时，是否也放弃了理解历史、社会以及人性幽深之处的其他可能？&lt;/p&gt;
&lt;p&gt;更深层的问题在于记忆的政治性。在身份政治盛行的时代，哈金的分析有了新的现实意义。身份政治往往基于对历史上的不公正的集体记忆：女性对父权制压迫的记忆、少数族裔对种族主义的记忆、性少数群体对歧视的记忆，等等。这些记忆为相应的身份认同提供了道德正当性和政治动员力。哈金的研究揭示了身份政治与记忆政治之间的关联。身份政治之所以以记忆为核心，不仅是因为历史，更是因为现代人将记忆作为自我的基础：我们是谁取决于我们记得什么，我们记得什么反过来决定了我们应该成为谁。这一循环论证构成当代身份政治的认识论闭环。最终，记忆的政治不仅关乎言说，更关乎遗忘，以及守护或打破哪些秘密。&lt;/p&gt;
&lt;p&gt;古希腊德尔菲神庙的入口处镌刻着那句永恒的箴言：“认识你自己。”这句话确立了西方人两千年来的崇高理想：通过理性和内省，发现一个内在的、真实的、不变的本质自我。在今天，对自我的探寻不再是一场纯粹的思辨之旅，而是充满了权力、话语和历史偶然性的博弈。首要的责任或许不再是“认识你自己”，而是“记得你自己”——不仅要记得那些构成我们生命的经历，更是要审慎地记得我们如何讲述这些经历，使用谁的语言来记忆，以及这种记忆将我们塑造成何种样貌的人。哈金的工作提醒我们，在一个专家知识日益渗透日常生活的时代，保持对这些知识形式的批判性反思不仅是学术责任，更是智识义务。只有通过历史化的视角来理解当前的概念框架，才能挣脱其无形的束缚，进而想象和创造出其他的可能。&lt;/p&gt;

    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-33&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;
&lt;h3 id=&#34;乔治斯瓦鲁萨基斯谈西方观念的形成&#34;&gt;乔治斯·瓦鲁萨基斯谈“西方”观念的形成
&lt;/h3&gt;&lt;div class=&#34;note-card&#34;&gt;
    &lt;div class=&#34;nc-accent&#34;&gt;&lt;/div&gt;

    &lt;div class=&#34;nc-header&#34;&gt;
        &lt;div class=&#34;nc-meta&#34;&gt;
            &lt;span class=&#34;nc-badge&#34;&gt;READING&lt;/span&gt;
            &lt;span class=&#34;nc-date&#34;&gt;2025-10-19&lt;/span&gt;
        &lt;/div&gt; &lt;a href=&#34;https://www.thepaper.cn/newsDetail_forward_31745991&#34; target=&#34;_blank&#34; class=&#34;nc-title&#34; title=&#34;访问原文&#34;&gt;
            乔治斯·瓦鲁萨基斯谈“西方”观念的形成
            &lt;svg class=&#34;nc-link-icon&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
        &lt;/a&gt;
    &lt;/div&gt;

    
    &lt;div class=&#34;nc-context&#34;&gt;
        &lt;div class=&#34;nc-quote-icon&#34;&gt;“&lt;/div&gt;
        &lt;div class=&#34;nc-summary-text&#34;&gt;乔治·瓦鲁萨基斯的著作《西方：一个观念的历史》挑战了人们普遍认为的“西方”概念起源于 19 世纪后期，用于帝国主义目的的观点。他追溯了这个术语从 19 世纪初的演变过程，特别是通过奥古斯特·孔德的工作，强调了它的复杂性和它所包含的各种含义。瓦鲁萨基斯反对将“西方价值观”视为排他性的观点，而是提倡普世价值观。&lt;/div&gt;
    &lt;/div&gt;
    

    
    
    
&lt;/div&gt;

&lt;style&gt;
     
    .note-card {
         
        --nc-bg-card: #ffffff;
        --nc-border: rgba(0,0,0,0.04);
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.08);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.12);
        
        --nc-title: #2c3e50;
        --nc-title-hover: #3a7bd5;
        --nc-meta: #999999;
        
        --nc-bg-context: #f8f9fa;
        --nc-border-context: #e2e8f0;
        --nc-quote-icon: #e2e8f0;
        --nc-text-summary: #555555;
        
        --nc-label-bg: #ffffff;
        --nc-label-text: #2d3748;
        --nc-content-text: #2d3748;
        --nc-link-icon: #cbd5e0;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.1);
        --nc-badge-text: #3a7bd5;

        position: relative;
        background: var(--nc-bg-card);
        border-radius: 12px;
        box-shadow: var(--nc-shadow);
        margin: 2.5rem 0;
        overflow: hidden;
        border: 1px solid var(--nc-border);
        font-family: inherit; 
        transition: transform 0.3s ease, box-shadow 0.3s ease, background 0.3s, border-color 0.3s;
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .note-card {
            --nc-bg-card: #1e1e1e;
            --nc-border: #333333;
            --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
            --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
            
            --nc-title: #f0f0f0;
            --nc-meta: #999999;
            
            --nc-bg-context: #252525;
            --nc-border-context: #444444;
            --nc-quote-icon: #333333;
            --nc-text-summary: #aaaaaa;
            
            --nc-label-bg: #1e1e1e;
            --nc-label-text: #cccccc;
            --nc-content-text: #dddddd;
            --nc-link-icon: #666666;
            
            --nc-badge-bg: rgba(58, 123, 213, 0.2);
        }
    }

    html[data-scheme=&#34;dark&#34;] .note-card {
        --nc-bg-card: #1e1e1e;
        --nc-border: #333333;
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
        
        --nc-title: #f0f0f0;
        --nc-meta: #999999;
        
        --nc-bg-context: #252525;
        --nc-border-context: #444444;
        --nc-quote-icon: #333333;
        --nc-text-summary: #aaaaaa;
        
        --nc-label-bg: #1e1e1e;
        --nc-label-text: #cccccc;
        --nc-content-text: #dddddd;
        --nc-link-icon: #666666;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.2);
    }

    .note-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--nc-shadow-hover);
    }

     
    .nc-accent {
        height: 4px;
        background: linear-gradient(90deg, #3a7bd5, #00d2ff); 
        width: 100%;
    }

     
    .nc-header {
        padding: 24px 28px 10px; 
    }

    .nc-meta {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 10px; 
        font-size: 13px; 
        color: var(--nc-meta);
        font-weight: 600;
        letter-spacing: 1px;
        text-transform: uppercase;
    }

    .nc-badge {
        color: var(--nc-badge-text);
        background: var(--nc-badge-bg);
        padding: 2px 6px;
        border-radius: 4px;
    }

    .nc-title {
        display: block;
        font-size: 2rem; 
        font-weight: 700;
        color: var(--nc-title);
        text-decoration: none;
        line-height: 1.3;
        transition: color 0.2s;
    }

    .nc-title:hover {
        color: var(--nc-title-hover);
    }

    .nc-link-icon {
        width: 20px; 
        height: 20px;
        color: var(--nc-link-icon);
        margin-left: 5px;
        vertical-align: middle;
        transition: color 0.2s;
    }

    .nc-title:hover .nc-link-icon {
        color: var(--nc-title-hover);
    }

     
    .nc-context {
        margin: 12px 28px 24px;
        background: var(--nc-bg-context);
        padding: 20px 24px;
        border-radius: 8px;
        position: relative;
        border-left: 4px solid var(--nc-border-context);
        transition: background 0.3s, border-color 0.3s;
    }

    .nc-quote-icon {
        position: absolute;
        top: 8px;
        left: 10px;
        font-family: serif; 
        font-size: 40px;
        line-height: 1;
        color: var(--nc-quote-icon);
        pointer-events: none;
        transition: color 0.3s;
    }

    .nc-summary-text {
        font-size: 1.7rem; 
        color: var(--nc-text-summary);
        line-height: 1.6;
        font-style: italic;
        position: relative;
        z-index: 1;
        padding-left: 15px; 
        transition: color 0.3s;
    }

     
    .nc-body {
        padding: 0 28px 32px;
        position: relative;
    }

     
    .nc-label {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        font-size: 13px; 
        font-weight: 700;
        color: var(--nc-label-text);
        background: var(--nc-label-bg);
        padding-right: 10px;
        margin-bottom: 12px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
        transition: color 0.3s, background 0.3s;
    }

    .nc-content {
        color: var(--nc-content-text);
        font-size: 1.6rem; 
        line-height: 1.75;
        transition: color 0.3s;
    }

     
    .nc-content p { margin-bottom: 1em; }
    .nc-content p:last-child { margin-bottom: 0; }
    
    .nc-content ul { padding-left: 20px; color: inherit; }
    .nc-content li { margin-bottom: 6px; }
&lt;/style&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-35&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        &lt;p&gt;乔治斯·瓦鲁萨基斯（Georgios Varouxakis），伦敦玛丽女王大学历史系教授、政治思想史研究中心主任。其研究领域为十九至二十世纪的政治思想史，重点涉及国际政治思想、帝国研究、“欧洲”与“西方”观念。代表作有《密尔论民族性》（Mill on Nationality，2002）、《维多利亚时代英国政治思想中的法国与法国人》（Victorian Political Thought on France and the French，2002）、《海外的自由：约翰·斯图亚特·密尔论国际关系》（Liberty Abroad: J. S. Mill on International Relations，2013）。&lt;/p&gt;
&lt;p&gt;瓦鲁萨基斯教授的新作《西方：一种观念的历史》（The West: The History of an Idea）于今年7月由普林斯顿大学出版社出版，一经问世便广受学界好评。在这部关于“西方”的谱系学研究中，瓦鲁萨基斯教授对“西方”这一政治和文化共同体自称的起源作了颠覆性解释。他系统梳理了“西方”内涵的多次演变，揭示其争议性定义背后的深层意图与历史影响，并深入探讨这一概念在当代及未来可能呈现的多样形态。全书由此为读者理解“西方”提供了纵贯古今的全面叙述。&lt;/p&gt;

    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-35&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-36&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        &lt;p&gt;瓦鲁萨基斯：我目前所致力于的“西方”观念研究与我早年的密尔研究间的确存在着一定关联。通过以密尔和法国为题完成博士论文，我对密尔与法国的联系及其所受法国思想的影响了如指掌。这里当然要提到法国哲学家、实证主义创始人奥古斯特·孔德，他与密尔曾长期保持书信往来，并建立起亲密的友谊。但后来二人在女性地位问题上产生分歧：如你所知，密尔坚持女性在智力上与男性平等，而孔德却认为女性智力低于男性，这种观点令密尔无法接受。&lt;/p&gt;
&lt;p&gt;言归正传，通过研读相关著作和诸多论文，我发现学界对“西方”观念的起源存在一种普遍共识。专业学者们指出，人们常把“西方”视为一个永恒的、不朽的概念，仿佛它自古希腊时期起就已存在。然而，这其实是一种时代误置的投射。问题的关键在于：人们究竟从何时开始自称为“西方”？又是从何时开始使用这个词来描述自身？&lt;/p&gt;
&lt;p&gt;学者们大都认为，作为自我指称的“西方”起源于十九世纪八十至九十年代，它被用于宣扬和推广帝国主义（特别是英帝国主义）、白人优越论和种族主义——换言之，“西方”是白人种族主义的一个新名称或别称。起初我觉得这个观点很有趣，但总觉得哪里不对。因为据我所知，早在十九世纪初，孔德及其遍布英国、巴西乃至世界各地的支持者和追随者，就已痴迷于谈论作为一种文化、一种文明的“西方”，并设想建立一个他们称之为“西方共和国”（République occidentale）的联邦体系，其论述至少可追溯到十九世纪四十年代。于是我意识到：问题出在时间节点上，“西方”自称的源起绝不是在十九世纪八十至九十年代，而是在更早的时期。而且学界关于意图、原因和动机的判断也完全错误，因为孔德实际上是一位极其坚决的反帝国主义者。孔德固然有诸多缺陷，我也并非为他辩护，但他对帝国的反感堪称极致，这种强烈的反帝国主义立场在十九世纪绝大多数的欧洲思想家中实属罕见，几乎无人能与之相比。&lt;/p&gt;
&lt;p&gt;因此，我认为，关于“西方”自称何时以及为何开始被使用的整套理论，在各方面都是站不住脚的。2007年，我受邀前往瑞典参加题为“何谓西方”的学术会议，我在会上尝试着提出了这一论点，自那时起，我发现无人能驳倒我的论证。十年后，我据此撰写了论文，而这正是本书研究的起点。就此而言，这项研究与我先前对密尔的探索间接相关。&lt;/p&gt;

    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-36&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-37&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        &lt;p&gt;瓦鲁萨基斯：这确实是我研究的意图之一，但并非主要目的。当前的主流观点在历史上并不准确。我只是想厘清真实的历史脉络。我并不反对后来确实有许多人使用“西方”一词来为帝国主义辩护的说法，但若将其概念起源归因于帝国主义的需求，则完全违背史实。实际上，欧洲人自十六、十七世纪起就已热衷于推行帝国主义，但他们当时并不觉得有必要称自己为“西方”，他们常以“基督教世界”（Christendom）或“欧洲”自居。诚如学界所指出的，欧洲人固然乐于将东方他者化、异域化，但直至十九世纪早期，他们都未曾以“西方”自称。&lt;/p&gt;
&lt;p&gt;因此，我的研究问题是：为什么到了十九世纪，他们需要一个新的称谓？答案在于，他们需要一个能够把自己同俄国区分开来的术语，而不是与亚洲、伊斯兰世界、非洲或更广义上的其他地区相区别。对于后者而言，“欧洲”和“基督教世界”的传统称谓已然足够。虽然俄国作为一个基督教国家（奉行东正教，而非天主教或新教），地理上属于欧洲的一部分，且自十八世纪初彼得大帝时代以来，就已融入欧洲国家体系与地缘政治格局，但它在拿破仑战争后却成为欧洲人最恐惧的威胁。欧洲人极度担忧俄国会主宰整个欧洲大陆。正因如此，越来越多人开始在西欧使用“西方”“西方的”等称谓，他们迫切地想与俄国划清界限。&lt;/p&gt;
&lt;p&gt;这一点在孔德的著作里有明确的表述，在孔德追随者的文献中也有清晰的说明，他们解释了为什么我们需要这个术语。而在更早的十九世纪二十年代，当希腊反抗奥斯曼帝国的独立战争爆发时，越来越多的法国评论者开始强调：我们的麻烦并非奥斯曼帝国，因为它终将崩溃；真正的问题在于，如若俄国攻占君士坦丁堡并征服奥斯曼帝国，其势力必将延伸至地中海地区，继而掌控欧洲。因此，他们开始谈论希腊，期待这个即将在独立革命中诞生的小国成为“西方”的一道堡垒，据此保护西欧免受俄国的威胁。&lt;/p&gt;

    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-37&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-38&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        &lt;p&gt;瓦鲁萨基斯：显而易见，十九世纪的情况已非常明朗。与之形成鲜明对比的是，十八世纪启蒙运动时期，许多思想家不仅反对帝国霸权，还对中国文化持开放态度。譬如伏尔泰就常借用中国的例子来批判那些以欧洲为中心的、源自《圣经》的基督教历史叙事，其他启蒙思想家也有类似的做法。但到了十九世纪，帝国主义和欧洲中心论的二元对立思维日益强化：欧洲自诩为文明的代表，而将其他地区的绝大多数族群视为野蛮人。&lt;/p&gt;
&lt;p&gt;我认为，这种认知确实存在，但当时欧洲人并不觉得有必要使用“西方文明”这一称谓。基于历史认同的延续，他们更倾向于以“欧洲文明”或“基督教文明”自称。他们自视为“基督教徒”或“欧洲人”，而把其他族群视作低等。因此，我的观点是，当欧洲人逐渐意识到有必要把自己与同样信奉基督教、同属欧洲的俄国人区分开来时，“西方”这一术语才真正变得不可或缺。&lt;/p&gt;
&lt;p&gt;当然，这些概念之间存在重叠。“欧洲文明”与“西方文明”这两个概念存在交集，但绝非完全等同。不同术语的使用暗含着微妙的区分：何种群体被纳入其中或排除在外？缘由何在？其确切含义又是什么？词语极为关键——这也是我新书的方法论核心：词语具有误导性，抽象概念既诱人又危险。所以，深入剖析这些概念的历史流变、既往含义及其未来可能承载的新内涵至关重要。这正是我致力于厘清这些概念区别的根本原因。&lt;/p&gt;

    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-38&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-39&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        &lt;p&gt;瓦鲁萨基斯：孔德最初在十九世纪二十年代的所有政治著作中，谈论的都是“欧洲”。他希望彻底重组他眼中世界上最先进的地区——西欧，因为它在科学技术等方面遥遥领先。他还坚持认为，自查理大帝时代，也就是公元八、九世纪以来，这片土地就已基于共同的文化经验而形成历史共同体。因此，他称之为“欧洲”，尽管这一称呼本身颇为耐人寻味。我在书中提到，在他十九世纪二十年代中期的一篇习作里，他试图澄清道：“为指代精神权力在国际关系领域所行使的职能，我不得不在‘欧洲的’（European）与‘普遍的’（universal）两词中择一使用。我更倾向于前者，因为它更为精确，也更契合过往的使用习惯，尽管它或许显得既过于宽泛，又过于狭隘。”孔德的意思非常明确，所谓过于宽泛，是因为欧洲地理概念包含了俄国与奥斯曼帝国，而他实际所指的仅限于西欧。所谓过于狭隘，则是因为这个概念没有把美洲和澳大利亚涵盖在内，那里生活着西欧人的移民后裔，孔德认为他们和西欧属于同一文化共同体。&lt;/p&gt;
&lt;p&gt;由此可见，早在十九世纪二十年代，他就已经意识到“欧洲的”一词并不理想。通过查阅他与密尔等人的通信，我发现截至1842年起，他不再将自己论述的对象称为“欧洲的”或“西欧的”，而是开始使用“西方”“西方的”等说法。实际上，孔德真正关注的是欧洲的特定区域及其在世界各地的移民殖民地，而“欧洲”一词容易引起混淆，因为人们显然是将其理解为一个纯粹的地理概念。&lt;/p&gt;

    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-39&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-40&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        &lt;p&gt;瓦鲁萨基斯：孔德不需要为这种矛盾张力负责。我再次申明，孔德当然有许多缺陷，我也并非为他辩护。但他坚决反对帝国主义，他的计划之一就是废除所有帝国，立即让所有殖民地独立，甚至取消欧洲的民族国家。他主张恢复精神权力与世俗权力的分离，世俗权力应归属于爱尔兰、托斯卡纳、威尔士、比利时及科西嘉等致力于发展工业的小型国家，他对工业发展极为重视；而精神权力则应由整个联邦统一行使。他设想并将这一精神共同体称为“西方”或“西方共和国”，而人类教宗暂居巴黎，由该精神权力机构来负责人民的道德教化、教育等事务。这是一个极为精细的方案。无论如何，这其中最值得注意的是其反帝国主义特质，这恰恰与人们对“西方”观念初始的普遍认知截然相反。&lt;/p&gt;
&lt;p&gt;其次，孔德并不希望其设想沦为“基督教俱乐部”。孔德对中国及中华文明深感兴趣，其法国继承者皮埃尔·拉菲特（Pierre Laffitte）更是如此。作为法兰西公学的教授，拉菲特对中国和中华文明有着更深厚的学养积淀。因此，孔德的最终目标是人类的统一。他希望“西方”率先完成自我重组，成为一支仁善、和平、反帝国主义的力量，而后逐步接纳其他国家。最后，“西方共和国”将自我消解，其首都也会从巴黎迁往欧亚交汇处的君士坦丁堡（今伊斯坦布尔），在那里建立“人类共和国”（the Republic of Humanity）。&lt;/p&gt;
&lt;p&gt;显然，这一愿景充满了乌托邦的色彩，但其内核是和平主义、反帝国主义和普遍主义的。在孔德的“人类宗教”中，中国、印度、伊斯兰世界的宗教领袖、哲学家与先知皆是值得被予以尊崇和纪念的“人类先贤”，他拒绝将其变为一个基督教的专属乐园。当然，孔德仍旧是以欧洲为中心的、以法国为中心的，甚至是以自我为中心的，但其普世胸怀在十九世纪思想家中已属罕见。因此，“西方”观念在其诞生之初，或许是乌托邦式的，但它既不是帝国主义的，也不具有排他性。它是一套奇特而精妙的构想，旨在重组西欧及其在美洲和澳大利亚的殖民地，以便日后能够在不经征服的情况下将全人类包容其间，而唯有当他地区做好准备并自愿加入时，这美好的愿景方可实现。&lt;/p&gt;
&lt;p&gt;这就是历史的吊诡之处，也是一段令人惊异的往事。当然，这仅是本书的开端。全书共十章，篇幅颇长，后续章节将展开更为复杂的、延续至今的历史叙事。&lt;/p&gt;

    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-40&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-41&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        &lt;p&gt;瓦鲁萨基斯：我在书里涉及的人物很多，此刻无法悉数记起，但书中某些人物的提及频率确实远高于他人——从索引便可见一斑。部分极其重要者甚至出现在章节标题之中。&lt;/p&gt;
&lt;p&gt;早在孔德之前，确有一些已被世人彻底遗忘的思想家，例如多米尼克·德·普拉特神父（the abbé Dominique de Pradt）。这位广受欢迎的作家在国际关系领域极具洞察力，能精准把握地缘政治动态。正是他坚持认为俄国对西方而言是最大的威胁，据他断言，希腊若击败奥斯曼帝国，将成为西方的防御屏障，由此融入西方世界。诸如这般的人物，虽活跃于孔德之前的时代，却仍对这个故事至关重要。政治哲学家邦雅曼·贡斯当（Benjamin Constant）也曾在与希腊有关的论述中使用过“西方”一词。相较于前人，孔德的重要性在于他提出了极其详尽、系统的“西方共和国”“西方联邦”构想，并为其未来规划了种种具体的细节。在孔德之后，还有形形色色的人物参与其中，数不胜数，其中包括世界各地的孔德追随者，但也涉及诸多背景各异的思想家。&lt;/p&gt;
&lt;p&gt;我在书中还讨论了来自俄罗斯、希腊、印度、加勒比地区、英国、法国、德国及美国的思想家。其中尤为关键的人物是弗朗西斯·利伯（Francis Lieber）——他不仅是美国政治科学的奠基人，更是十九世纪美国最重要的知识分子与学者之一。这位德裔学者在1827年以移民身份前往美国，他早年受教于德国的大学，十九世纪七十年代初在美逝世，人生的大半时光皆在美国度过。带着德国式的教育背景来到美国，他开始反思：为什么我们的文明没有一个专属称谓？于是他提出一个用于描述欧美共同文明的术语，这个意为“高加索一侧”的术语“Cis-Caucasian”极其迂曲且难以推行。但他同时也频繁使用“西方的”一词，因为他在德国长大，早已熟悉该词。利伯无疑是将“西方”与“西方文明”用法传播至美国过程中的重要人物，在我书的第四章关于美国的论述中，他被视为推动“西方”观念在美国发展并获得广泛接受的核心贡献者。&lt;/p&gt;
&lt;p&gt;在第五章关于第一次世界大战的论述中，涌现了许多极其重要的人物。无论是作为“西方”的捍卫者还是批判者，他们都在重新定义这一术语上发挥了重大作用。美国方面最具代表性的人物是记者沃尔特·李普曼（Walter Lippmann）。从一战直至二十世纪六十年代，李普曼始终是二十世纪西方世界最具影响力的媒体人，我甚至无法用语言来概括他的影响力之大。他每周撰写两篇专栏，美国总统或总统候选人定会拜读其文，因为他们深感有必要得到他的认可或附和他所主张的内容。正是这样一位深度痴迷“西方”及“西方文明”观念、熟知欧洲（其家族为德裔犹太移民，他本人几乎每年夏季皆旅欧生活）的人物，在这段历史叙事中具有关键意义。此外还有相对不甚知名者，譬如德国小说家托马斯·曼，在一战期间作为“西方”的批判者扮演了重要角色。他从德国立场出发，抨击“西方”和“西方文明”流于浅薄，强调德国拥有更深厚的“文化”。&lt;/p&gt;
&lt;p&gt;而按当今标准来看仍属于非西方世界的印度诗人拉宾德拉纳特·泰戈尔，亦是这场论争中的核心人物。一战期间，泰戈尔巡访日本、欧美各国，就民族主义问题发表演说，这些演讲引发广泛的讨论。早在战前他就已经获得了诺贝尔文学奖，兼具文学巨匠与社会名流的双重身份，且英语表达精湛。我在书中详细追溯了泰戈尔关于西方的观点被多次引用、赞同或批驳的历程，他无疑是二十世纪初非西方世界中对“西方”观念作出最重要贡献的人物。当然后期还有甘地等诸多人物参与论辩，但泰戈尔的地位不容置疑。&lt;/p&gt;
&lt;p&gt;接着，一战后，故事中早已登场的一些人物——如沃尔特·李普曼——继续发挥着重大影响。其间也出现了多位法国思想家的身影，例如在二战期间逝于英国的哲学家暨神学家西蒙娜·薇依，以及流亡伦敦参与抗德运动的法国哲学家、社会学家雷蒙·阿隆。阿隆在书中的冷战章节再次成为焦点人物，他是深入分析“西方”观念及其涵义的重要思想家之一，他坚定地捍卫“西方”。&lt;/p&gt;
&lt;p&gt;另一位关键人物是非裔美国小说家理查德·赖特（Richard Wright），他在二十世纪五十年代堪称全球最负盛名的黑人，他凭借小说《土生子》（Native Son）以及自传等诸多作品一度享誉美国文坛。然而，由于无法忍受美国的种族主义与种族隔离政策，他在1946年选择移居巴黎，并在那里生活至1960年英年早逝。其间，他成为当时所谓“第三世界”，即后殖民国家和发展中国家的重要辩护人。但耐人寻味的是，他始终坚持自己是西方人：“我之所以感到自己属于‘西方’，根本上在于我对人生所持的世俗化观念。我相信政教分离。我相信国家本身具有独立的价值。……我相信，一切思想都应当有权在公共领域中自由流通，不受限制。我相信，所有人皆应享有畅所欲言的权利——不必畏惧政治权力的压制，无需担心某些特殊阶层（如神职人员与教会人士）所宣称专属的、不可见力量的惩罚性手段或威胁。”诸多因素促使他推崇西方的原则，其中理性主义对他而言至关重要。这位自学成才者出身低微，家境贫寒，没有接受过正规教育，他在芝加哥打工期间通过自主学习成为一名具有哲学思辨能力的作家，写下大量随笔、著作及政治评论文章。他是一个令人瞩目的思想人物，他批评西方，无论是在美国的种族问题上，还是在外交政策领域，都未能在各国政府的实际政策中践行西方原则。而他所有的批判皆源于西方的内部视角。他宣称：“我是西方人，我与你同为西方人，甚至可能比你更具西方精神——但这并不意味着我会全盘接受你的观点。”他在书中占据的篇幅几乎与孔德相当，有趣的是，他们二人的居所均位于巴黎王子先生街（Rue Monsieur le Prince），彼此仅相隔两栋房屋。这是字面意义上的比邻而居，只不过中间隔着整整一个世纪。这桩巧合令我不由称奇。&lt;/p&gt;
&lt;p&gt;冷战时期同样涌现了许多重要人物，例如流亡的波兰诗人切斯瓦夫·米沃什等。而在后冷战时代，亦即二十世纪九十年代初苏联解体后，我重点探讨了弗朗西斯·福山的“历史终结论”，以及塞缪尔·亨廷顿的“文明冲突论”。此时还值得一提的是法国小说家米歇尔·维勒贝克（Michel Houellebecq），在过去三十年的所有小说里，他总会提及孔德，他坦言自己深受孔德影响，并对孔德充满敬仰。他在法国享有极高的声望，他就“西方”和“西方文明”提出的观点颇具争议且影响深远。当然，还有众多其他学者和政治家被纳入我的研究范围之中。&lt;/p&gt;
&lt;p&gt;我这本新书融合多种体裁，但请相信，它在逻辑上是自洽的。这些人物彼此援引思想理论，参照相同著作，参与共同论辩，因而形成了内在的逻辑连贯性。书中的许多史料来源于哲学家，甚至政治家的习作——以亨利·基辛格为例，他不仅在冷战时期举足轻重，早在哈佛攻读博士阶段，其思想就已在历史叙事中占据重要地位。我把大量的小说文本当作史料加以使用，还广泛汲取了记者——尤其是李普曼这类兼具哲学素养与深刻洞见的精英报人的见解。总之，多元背景的各色人物及其言论共同构成了我新书的论述基石。&lt;/p&gt;

    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-41&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-42&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        &lt;p&gt;瓦鲁萨基斯：现今来看，或许不再如此。但在历史上，在“西方”观念的发展进程中，欧洲人确实对此更具洞察力。这也正是为何在“西方”成为超国家文化或文明，乃至联盟的概念之前，欧洲大陆人更早、更频繁地使用这一术语。&lt;/p&gt;
&lt;p&gt;就政治意义上而言，“西方”术语的首次使用可追溯至公元395年，此时罗马帝国分裂为东罗马帝国和西罗马帝国。这是历史上首次出现一个被称为“西方”的政治实体，东罗马帝国以君士坦丁堡为都城，西罗马帝国的疆域则包含罗马和意大利的其他城市。当西罗马帝国被日耳曼入侵者征服后，它便消弭于无形。但这些日耳曼入侵者逐渐萌生野心，渴望继承古罗马帝国的遗产，其中的一位领袖查理大帝（Karl der Große）在公元800年的圣诞节被教皇加冕为“罗马人的皇帝”（Imperator Romanorum）。但大多数人并未真正视其为“罗马人的皇帝”，因为君士坦丁堡仍有着另一位罗马皇帝，亦即伊琳娜女皇。尽管他们可宣称她不具备称帝的合法性，无足轻重，但两年后，男性继承者尼基弗鲁斯一世即位。因此，实际上，那位试图成为西罗马帝国继承者的皇帝，就被视作“西方的皇帝”。&lt;/p&gt;
&lt;p&gt;于是，“西方”便自然而然地成为后来的德国人和法国人惯用的术语，在他们的历史记忆和地理认知中，他们正身处西罗马帝国的所在地。但对英国人来说却并非如此，不列颠从未属于查理曼帝国或后来的德意志民族神圣罗马帝国，它始终是孤悬海外的岛屿。正因如此，我在第三章中指出：正是那些曾在德法求学，或本身具有德法血统，或与欧洲大陆及其历史有着深厚渊源的人物，开始更频繁地使用“西方”和“西方的”一词。当然，如前所述，孔德及其追随者们自十九世纪五十至六十年代起，也开始详尽地阐释其愿景，并有意识地对“西方”进行精细化的定义。&lt;/p&gt;
&lt;p&gt;这个故事的一个悖论在于：最后一个接受自身属于“西方”的国家竟然是美国，该词在美国普及的时间甚至晚于英国。而如今人们却普遍认为“西方”意指盎格鲁-美利坚及其盟友，但历史事实恰恰相反，美国是最晚加入这一概念体系的国家。所以，我着力揭示的正是这一历史进程中的种种悖论。&lt;/p&gt;

    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-42&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-43&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        &lt;p&gt;瓦鲁萨基斯：是的，我尝试践行阿米蒂奇所提出的研究路径。如果你试图像我这样，对一个延续至少两个世纪，甚至拥有更久远“前史”的观念进行历史考察，那么这种研究便不可避免地是连续性的。你无法像研究十六或十七世纪的文本那样，把注意力精准地聚焦在某一特定语境上，当时的史料有限，你可以详尽地追踪一场辩论的所有隐喻、含义和意图。而就我所研究的对象而言，最接近历史真实的做法只能是“连续的语境主义”。&lt;/p&gt;
&lt;p&gt;此外，我所遵循的，是尼采式的谱系学历史研究方法（genealogical historian approach）。尼采强调新的认知会不断迭代更替先前的理解，这些“意义”如同沉积物般层层累积堆叠，我尤为欣赏这一观点。他指出，基督教教义的新诠释虽逐渐占据主导，却从未完全覆盖其旧有的意义。尽管使徒保罗的教义诠释业已成为主流，但在他之前的其他流派对基督教的诠释并未消失，而是持续存在。我在此参考了剑桥大学哲学系教授雷蒙德·戈伊斯（RaymondGeuss）的一篇精彩论文，他对尼采方法论的解读让我深以为然。因此我认为，就“西方”而言，它在历史上经历过许多次不同的重新阐释，新的释义轮流占据主导，它们固然会取代先前的理解，但从未完全抹除旧有释义的效力。所以，在概念的历史演变过程中，不同时期会浮现出各异的强调重点：基督教内涵可能重新突显，世俗主义主张也会再次抬头；时而有人重申美国应作为西方的领导者，时而西欧被视为西方的核心。这些层叠蛰伏的释义会以迷人的方式不时复现。&lt;/p&gt;
&lt;p&gt;有感于此，我在这本书的第九章中专门分析了特朗普在2017年第一任期内于华沙发表的一次演讲。我认为，唯有结合长时段视角并联系“他在波兰发表演讲”这一事实，才能充分理解其深层意涵。如果读者已通读全书至此，便已然明白波兰的特殊地位，也就能理解此番演讲为何在波兰引发强烈共鸣。&lt;/p&gt;
&lt;p&gt;总之，若必须说明我的方法论立场，我认为尼采的谱系学方法对此类研究最为适用。如你所说，这本质上是一场诠释之争，而谱系学恰能有效应对这种特性。当然，我也认同昆廷·斯金纳的批评：“不存在可供我们书写的观念史，而只有关于观念的各种不同用法的历史。”因此，我所研究的，是观念的使用史。有关观念和概念的各种用法的历史，才是我所致力探索的主题。&lt;/p&gt;

    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-43&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-44&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        &lt;p&gt;瓦鲁萨基斯：我从未试图为此概念强行赋予某种统一性。相反，我在某种程度上对它进行解构，但与此同时，我不认为这意味着它毫无意义。“西方”始终承载着历史、宗教和文化上的深厚意涵，是一个极具召唤力的概念，因此人们才会在政治辩论中持续运用它来实现自身目标，这也使其成为意识形态斗争的一部分。不同群体可将其诠释为截然不同的含义，并借此追求政治目的。政治学者可以证明，即便是自相矛盾的信息也能奏效，因为在民主制度中，立场迥异的民众会按照自身意愿来理解你的言论，从而投票支持你。&lt;/p&gt;
&lt;p&gt;我不愿意去为这个术语下定义，那样将陷入自相矛盾。我认同尼采在《论道德的谱系》中的著名论断，“可定义的只是那种无历史之物”，一个有着悠久历史的概念是无法被定义的，只能通过谱系学与历史学方法研究其不同层面的含义。因此，我最不愿意做的事情就是去定义“西方”，比方说，它包含哪些国家，它究竟意味着什么。我研究的是这个概念的用法，而通过研究它的用法，我希望能够澄清争议，并确保当某人为私利滥用此概念时，会有人指出：且慢，那只是其中一种释义，未必是最准确或最相关的一种。&lt;/p&gt;
&lt;p&gt;我深知，这种做法对追求清晰逻辑结构的记者或哲学家来说并不理想。但“西方”本就不是逻辑建构的产物，它是历史建构的结晶。与所有的历史事物一样，它复杂难解，与所有的政治概念一样，它充满争议。但正因其饱受争议，人们才会不断地使用这一术语，无论是为了捍卫它，还是为了批评它、攻击它。这就是为什么我认为厘清它过去的含义，及其可能具有的潜在意涵非常关键。而通过展示这一概念在历史中的可塑性，我也希望能够揭示它在未来所可能承载的全然不同的意义，以及容纳不同成员的潜力。要知道，希腊最初并不属于查理曼时代的“欧洲”或任何早期“西方”的一部分，恰恰相反，希腊人在文化和语言上引领着东罗马帝国。然而，近代希腊不仅被孔德“邀请”加入西方，如今更已成为欧盟和北约的成员。同样地，乌克兰人多数信奉东正教，过去从未被西方视作同类，如今他们却在某种意义上为加入西方而战，爱沙尼亚人、波兰人与德国人或许都对此深怀感激。在这个意义上，“西方”的内涵与成员始终随情势而变。遗憾的是，这些现象无法在逻辑或哲学上被整齐划一地界定，但它们却在历史上具有至关重要的意义。&lt;/p&gt;

    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-44&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-45&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        &lt;p&gt;瓦鲁萨基斯：的确，全球思想史最近变得非常流行，但我对它的态度取决于如何定义它。我可能会接受这个术语，也可能不会。严格来说，不可能存在真正意义上的全球思想史，因为没有人能够以全球视野对任何概念、观念及其传播进行完备的历史研究。没有人精通所有语言，也不可能通晓每场辩论的语境以及每种术语的含义。但若采用更审慎的定义，例如将研究“世界应如何建构”“国际体系的组织架构”等宏观议题的思想史称为“全球的”，那么我的著作确实属于全球思想史的范畴。当人们谈论“世界”“西方”，以及“西方在世界中的角色”时，他们讨论的其实是一种关于世界的愿景。从这个角度来看，我这本书完全可以被视作一部全球思想史的著作。&lt;/p&gt;
&lt;p&gt;在安德鲁·萨托里（Andrew Sartori）与塞缪尔·莫恩（Samuel Moyn）主编的《全球思想史》（Global Intellectual History）论文集中，我认同剑桥教授邓肯·贝尔（Duncan Bell）提出的定义——这最接近我所能接受的“全球思想史”意涵。若按照他所提议的那样来进行界定，我的著作便可以算作全球思想史。但如果所谓的“全球思想史”是指要从所有人的、无所不包的视角来研究“西方”观念的历史，那么恕我无法做到。我认为无人能够做到。我主要研究的是西方人的自我认知。不过，正如我先前提到的，你极具洞见的问题让我想起，确实有泰戈尔，以及来自加勒比地区和非洲的一些非西方世界的思想家参与这场争论。由于他们影响了西方人对自身的理解，因而也成为西方内部辩论的重要组成部分。&lt;/p&gt;

    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-45&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-46&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        &lt;p&gt;瓦鲁萨基斯：你的问题使我有机会强调书中结论部分明确阐述的观点：我反对将某些价值观冠以“西方价值观”之名。一些西方人将民主、自由民主、言论自由、性取向自由或平等、正义的理想统称为“西方价值观”，这种表述在历史上是不准确的。的确，其中许多，甚至绝大多数的价值观是在近代的西方才被整合成型的，但其起源却往往来自世界的其他地区。&lt;/p&gt;
&lt;p&gt;更重要的是，某种观念或某件事物在哪个地方首先取得历史上的成功，往往只是历史的偶然，而非必然，这无关所有权的归属。正如现代希腊人不能宣称拥有古希腊文明的所有权。古希腊人创造出辉煌的成就，并创造性地整合他们在腓尼基、埃及和周边地区所发现的智慧成果，那只是历史的偶然，这并不意味着我们对它拥有独占权。我们何其有幸使用同一种语言并经历相同的文化演进，与古希腊语言有着天然的亲缘关系。能读懂古希腊文的人固然幸运，但亚里士多德、柏拉图、苏格拉底属于全人类，而非希腊人独有。同样地，所谓西方价值观也不应当被视作西方的专属。&lt;/p&gt;
&lt;p&gt;我不喜欢“西方价值观”这个说法，因为它仿佛是在对世界其他地区的人们宣告：这些东西是我们的，我们取得了成功，你们应当效仿，因为它们更成功或更优越。如果你是中国人、印度人或非洲人，被告知“必须改变成我们的模式，因为它更加优越”，感受必然不佳。我个人认为，这些价值观中的大多数确实是值得推崇的。尽管它们的具体实践方式和内涵仍有待商榷，但它们应当以普遍性的名称来加以呈现，这样才能对全世界人民都具有吸引力。若希望人们能够真正接纳这些价值，就不应将其称为某一方的专属物。正因如此，我反对使用“西方价值观”这一说法。&lt;/p&gt;
&lt;p&gt;实际上，我们如今视为西方主流价值的某些观念，并非自古就存在于西方——它们实则是在近代才被逐步整合成现有形态。别忘了，在二十世纪五十年代的英国，同性恋者仍会被投入监狱，而更早几个世纪里，宗教裁判所曾对民众实施极其残酷的迫害行径。当然，这一过程可能并非偶然：西方内部为此经历过斗争与融合，多种因素相互作用才造就了今日所见的结果。但这绝不意味着所有权垄断。总而言之，我坚持认为，有许多美好的价值理念值得全世界的人们共同思考与采纳，它们不应被称为“西方价值观”。&lt;/p&gt;

    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-46&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;
&lt;h3 id=&#34;李公明一周书记与启蒙话语共舞的暴力感官和猛料&#34;&gt;李公明︱一周书记：与启蒙话语共舞的……“暴力感官”和猛料
&lt;/h3&gt;&lt;div class=&#34;note-card&#34;&gt;
    &lt;div class=&#34;nc-accent&#34;&gt;&lt;/div&gt;

    &lt;div class=&#34;nc-header&#34;&gt;
        &lt;div class=&#34;nc-meta&#34;&gt;
            &lt;span class=&#34;nc-badge&#34;&gt;READING&lt;/span&gt;
            &lt;span class=&#34;nc-date&#34;&gt;2025-10-19&lt;/span&gt;
        &lt;/div&gt; &lt;a href=&#34;https://m.thepaper.cn/detail/31787323&#34; target=&#34;_blank&#34; class=&#34;nc-title&#34; title=&#34;访问原文&#34;&gt;
            李公明︱一周书记：与启蒙话语共舞的……“暴力感官”和猛料
            &lt;svg class=&#34;nc-link-icon&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
        &lt;/a&gt;
    &lt;/div&gt;

    
    &lt;div class=&#34;nc-context&#34;&gt;
        &lt;div class=&#34;nc-quote-icon&#34;&gt;“&lt;/div&gt;
        &lt;div class=&#34;nc-summary-text&#34;&gt;《暴力感受》探讨了19世纪末的维也纳和柏林，考察了启蒙运动和颓废主义的相互作用。斯科特·斯佩克特通过各种资料，分析了那个时代的性、犯罪和社会焦虑。他认为，暴力幻想与那个时代的智力与科学进步交织在一起，并质疑第一次世界大战是这些幻想的原因还是结果。这项研究挑战了对进步的简单化看法，突出了现代性、暴力和身份之间的复杂关系。&lt;/div&gt;
    &lt;/div&gt;
    

    
    
    
&lt;/div&gt;

&lt;style&gt;
     
    .note-card {
         
        --nc-bg-card: #ffffff;
        --nc-border: rgba(0,0,0,0.04);
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.08);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.12);
        
        --nc-title: #2c3e50;
        --nc-title-hover: #3a7bd5;
        --nc-meta: #999999;
        
        --nc-bg-context: #f8f9fa;
        --nc-border-context: #e2e8f0;
        --nc-quote-icon: #e2e8f0;
        --nc-text-summary: #555555;
        
        --nc-label-bg: #ffffff;
        --nc-label-text: #2d3748;
        --nc-content-text: #2d3748;
        --nc-link-icon: #cbd5e0;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.1);
        --nc-badge-text: #3a7bd5;

        position: relative;
        background: var(--nc-bg-card);
        border-radius: 12px;
        box-shadow: var(--nc-shadow);
        margin: 2.5rem 0;
        overflow: hidden;
        border: 1px solid var(--nc-border);
        font-family: inherit; 
        transition: transform 0.3s ease, box-shadow 0.3s ease, background 0.3s, border-color 0.3s;
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .note-card {
            --nc-bg-card: #1e1e1e;
            --nc-border: #333333;
            --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
            --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
            
            --nc-title: #f0f0f0;
            --nc-meta: #999999;
            
            --nc-bg-context: #252525;
            --nc-border-context: #444444;
            --nc-quote-icon: #333333;
            --nc-text-summary: #aaaaaa;
            
            --nc-label-bg: #1e1e1e;
            --nc-label-text: #cccccc;
            --nc-content-text: #dddddd;
            --nc-link-icon: #666666;
            
            --nc-badge-bg: rgba(58, 123, 213, 0.2);
        }
    }

    html[data-scheme=&#34;dark&#34;] .note-card {
        --nc-bg-card: #1e1e1e;
        --nc-border: #333333;
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
        
        --nc-title: #f0f0f0;
        --nc-meta: #999999;
        
        --nc-bg-context: #252525;
        --nc-border-context: #444444;
        --nc-quote-icon: #333333;
        --nc-text-summary: #aaaaaa;
        
        --nc-label-bg: #1e1e1e;
        --nc-label-text: #cccccc;
        --nc-content-text: #dddddd;
        --nc-link-icon: #666666;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.2);
    }

    .note-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--nc-shadow-hover);
    }

     
    .nc-accent {
        height: 4px;
        background: linear-gradient(90deg, #3a7bd5, #00d2ff); 
        width: 100%;
    }

     
    .nc-header {
        padding: 24px 28px 10px; 
    }

    .nc-meta {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 10px; 
        font-size: 13px; 
        color: var(--nc-meta);
        font-weight: 600;
        letter-spacing: 1px;
        text-transform: uppercase;
    }

    .nc-badge {
        color: var(--nc-badge-text);
        background: var(--nc-badge-bg);
        padding: 2px 6px;
        border-radius: 4px;
    }

    .nc-title {
        display: block;
        font-size: 2rem; 
        font-weight: 700;
        color: var(--nc-title);
        text-decoration: none;
        line-height: 1.3;
        transition: color 0.2s;
    }

    .nc-title:hover {
        color: var(--nc-title-hover);
    }

    .nc-link-icon {
        width: 20px; 
        height: 20px;
        color: var(--nc-link-icon);
        margin-left: 5px;
        vertical-align: middle;
        transition: color 0.2s;
    }

    .nc-title:hover .nc-link-icon {
        color: var(--nc-title-hover);
    }

     
    .nc-context {
        margin: 12px 28px 24px;
        background: var(--nc-bg-context);
        padding: 20px 24px;
        border-radius: 8px;
        position: relative;
        border-left: 4px solid var(--nc-border-context);
        transition: background 0.3s, border-color 0.3s;
    }

    .nc-quote-icon {
        position: absolute;
        top: 8px;
        left: 10px;
        font-family: serif; 
        font-size: 40px;
        line-height: 1;
        color: var(--nc-quote-icon);
        pointer-events: none;
        transition: color 0.3s;
    }

    .nc-summary-text {
        font-size: 1.7rem; 
        color: var(--nc-text-summary);
        line-height: 1.6;
        font-style: italic;
        position: relative;
        z-index: 1;
        padding-left: 15px; 
        transition: color 0.3s;
    }

     
    .nc-body {
        padding: 0 28px 32px;
        position: relative;
    }

     
    .nc-label {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        font-size: 13px; 
        font-weight: 700;
        color: var(--nc-label-text);
        background: var(--nc-label-bg);
        padding-right: 10px;
        margin-bottom: 12px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
        transition: color 0.3s, background 0.3s;
    }

    .nc-content {
        color: var(--nc-content-text);
        font-size: 1.6rem; 
        line-height: 1.75;
        transition: color 0.3s;
    }

     
    .nc-content p { margin-bottom: 1em; }
    .nc-content p:last-child { margin-bottom: 0; }
    
    .nc-content ul { padding-left: 20px; color: inherit; }
    .nc-content li { margin-bottom: 6px; }
&lt;/style&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-48&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        让读者穿行在十九世纪末欧洲大都市的光明与黑暗、中心与边缘、上升与堕落之间，这就是斯科特·斯佩克特的《启蒙与颓废：世纪末时期柏林和维也纳的地下世界》（Violent Sensations: Sex，Crime，and Utopia in Vienna and Berlin，1860-1914，2016；沈辰成译，上海三联书店，2025年8月），原书名直译是“暴力感官：维也纳与柏林的性、犯罪与乌托邦，1860-1914”。在这里要顺便提到的是，在该译本中常见的是把violent sensations译作“暴力猛料”（第一次出现是在第二页），准确来说是指violentas sensations（作为猛料的暴力）。但是作者马上明确地说violent sensations“这一术语最直接的指代对象是诸多文化幻想。……同时，这意味一种新型的忧虑，一种内在而无意识的自我，这种自我受暴力冲动的支配——这是一种隐秘、强大，甚至难以克制的性冲动或者犯罪冲动”（2-3页）。在这里强调的是与暴力相关的幻想与忧虑，虽然也提到这些幻想的载体是审判、丑闻和故事；另外书中把sensations译作“感官猛料”，用来描述各种丑闻事件，放在书中征引繁密的丑闻事件案例的语境中，以“猛料”翻译在sensation本义中就有的轰动性事件的意思，当然是合适的。因此，在原书名中的violent sensations应该包涵有与暴力相关的感官幻想、忧虑和丑闻事件等比较丰富和复杂的涵义。看来，从翻译violent sensations这个角度来说，已经能够精准把握到这场穿越“巴比伦”柏林和维也纳的“Citywalk”的真实氛围。
    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-48&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-49&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        从该书的内容来看，隐藏在文明深处并且骤然喷发的暴力与性的幻想及行为是贯穿全书的主线。流浪汉、杀人犯、精神病患者、性倒错者、强奸犯、警察、法官、科学专家、记者、专栏作者、报纸主编、出版人等等是出场的主角。就如作者所言：“在本书开篇，我们勾画了大都市的矛盾，在后续章节中，大都市的矛盾在性幻想和暴力幻想中占据了中心位置。……人们质疑文明本身就是堕落之源，堕落不但滋生了肉欲和暴力。而且使得性欲和暴力成为人们的避难所，让人们得以排遣对于日常生活的既成事实的厌倦。”（383—384页）在该书中，19世纪晚期到20世纪初期欧洲都市文化现象中的文明与颓废，地下世界中的罪与罚，现代性心灵中的幻想与堕落，边缘与中心的身份互塑与利益博弈……，所有这些都围绕着暴力与性的具体案例而展开。
    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-49&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-50&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        “启蒙”与“颓废”则是对这些世纪末现象进行表述和剖析的理论话语，是一种历史判断与评价。所谓“启蒙”在这里不是指启蒙运动谱系的延续，而是指此期以柏林和维也纳为代表的欧洲大都市作为科学理性和各门类知识和新兴学科发展的中心所产生的氛围；而“颓废”则是指在大都市充斥着堕落、犯罪和暴力，两者之间构成了现代文明的矛盾图景，揭示了现代性发展的两个方面。作者对“世纪末”和“颓废”在此书中的使用语境有这样的解释：“当我们把1900年前后的时代称为‘世纪末’(fin de siecle）或者用‘颓废’形容当时的文化思潮时，我们就是在对19世纪末20世纪初的欧洲大都市做出一种苛刻但令人着迷的评价。”（导言，1页）“世纪末”与“颓废”是一种“评价”，也可以说是一种历史与道德的判断。斯佩克特以苛刻和迷人来形容这种判断的性质以及所激发的情绪，因为所针对的对象是危险的美女、轰动的故事、贫困的城市、危险的街道、暴力的犯罪以及泛滥的色情。但这仅是此时欧洲大都市社会与文化图景中的一方面，同时存在的另一面是科学理性的胜利、专业知识的巨大进步以及由此产生的对于“进步”的自信甚至自负的态度。假如作者的描述止步于此，这也仅是一种客观的历史叙事，再深入下去也是属于叙事史学的方向。但是作者的研究主旨显然另有所图：“上述两种截然相反的图景相互勾连，成为当时人们看待世界、看待自身在世上所处位置的途径的组成部分之一，这是如何实现的呢？现代性有着许多的层面，它们时而彼此共存，时而相互矛盾，除此以外，整体而言，这些层面和这些层面之间的张力普遍具有一种神话特质：这是看待他者和自身的一种方式，通过装载符号的图像和叙事系统，揭示起源、本质以及命运。”（同上）这就是在叙事之中更具有文化人类学分析和历史社会学研究的性质，科学理性与进步主义的叙事究竟是如何与颓废、犯罪和惩罚交织在一起，共同建构着欧洲都市的现代性形象？以“现代性”的概念谱系可以对此做出有成效的分析，因为在前所未有的大都市文化现象中产生的生产与消费、功利与美感、肉体与精神、欲望与惩罚等对立状态中的冲突就是现代性观念的内在冲突的多种表征。
    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-50&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-51&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        作者在“导言”中对全书内容作了概述。第一章“黑暗的城市，光明的未来”探索在世纪之交时期人们围绕城市和犯罪的讨论，找出这些讨论中预先设置的有关现代性的焦虑与乐观的二元语境，解释为何在各种文本中的大都市现代性体验大幅增加，以及在所关注的犯罪争论中揭示一个更加深刻的历史问题：犯罪起源这个问题本身、特别是有罪或者无罪的概念本身是如何产生的。第二章“相同的起源”通过论述一场早期的同性恋运动和同性恋者身份认同的初步建构的复杂关系，探索边缘性的身份认同的起源及其与暴力的关系的议题。第三章“感官和感情”通过研究世纪之交的同性恋活动、解放运动和公众人物涉足其中的一系列著名性丑闻，梳理三个领域之间的复杂关系：男性同性恋者体验的性身份认同——医生、法官和警察对于性别错乱的定义——同性恋阴谋论的文化幻想。第四章“乌托邦式的尸体”讨论“性感女人和性欲杀手”，介绍几位奥地利女性主义活动家的思想和一些医学著作、社会科学著作以及新闻报道作品，并对新闻报道、警察档案以及法庭记录中涉及奸杀卖淫者的内容进行文本分析。结合这些案件，解读罗伯特·穆齐尔（Robert Musil）和奥托•魏宁格（Otto Weininger）的一些文本，从而探索人们如何把刺激感官、耸人听闻的暴力幻想同针对欧洲文明的批判联系起来。第五章“血腥的谎言”把对犹太民族杀人献祭的指控和相关案例与其他议题联系起来，那些议题包括：现代化和启蒙运动、颓废堕落和社会进步、种族和性别，它们也贯穿在前面章节的围绕性和暴力的讨论中。最后谈到了人们在解释这一时期的反犹主义时，关于文化想象中的“内在他者”的自我反思往往遭到了忽视。（5—8页）
    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-51&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-52&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        应该强调的是，作者在“启蒙与颓废”之间最为关注的焦点是性问题，性是“暴力感官/猛料”的美学与犯罪学的起点和终端。斯佩克特揭示了欧洲新兴大都市给当时人们带来的最新、最强烈刺激的一种前所未有的生活体验，而性体验是其中最核心的部分，这也是把维也纳与柏林作为并列考察对象的重要理由——“虽然这两座城市截然不同，但它们均既是现代社会有关性与性别的思想观念发展演变的关键地点。也是激发这些有关性与性别的思想观念的政治运动、解放运动发生、发展的关键地点。”（2页）接着列举了一些以性问题为中心的标志性事件和思潮：性学研究的诞生、同性恋身份认同的初次实践、反对迫害性少数群体的运动以及世纪之交女性主义的“第一次浪潮”。另外，关于维也纳和柏林成为所谓边缘的和极限的暴力幻想的温床的例子，也是与性紧密相关：红颜祸水的人物形象、色情谋杀的报道、地下卖淫小说、有同性恋取向的公众人物的种种丑闻……。“当时，色情幻想出人意料地在许多领域中占据突出的位置，包括：高雅文化（包括文学和哲学)、学术研究（特别是性学、城市社会学以及犯罪学）以及大众文化（包括小说和大众媒体对离奇案件的新闻报道)。在本著作，笔者试图归纳分析上述貌似分散实则相关的文本。”（同上）对于研究不同历史语境中的思想解放运动的研究者来说，在“启蒙与颓废”的历史叙事中是否对于与性观念、性行为和性别文化的维度、文本有足够的重视，斯佩克特的研究很有启发性。实际上在我们亲历过的历史语境中，思想文化的“拨乱反正”与“地下世界”的sensations（感官、猛料）之间的关系并非不存在，我记得几十年前的一些非虚构作品（当时比较普遍称作报告文学）实际上就是相关的文本，然而在研究中并未受到应有的重视。
    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-52&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-53&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        斯佩克特很明确地指出他的研究工作和该书的目的绝不是要为“边缘化理论”（marginalization thesis）增添什么论证的材料，不是要通过给涉及性问题的他者（例如同性恋者、妓女以及犹太人）贴上边缘人物的标签，从而让那些正常的、值得尊敬的、有用的和遵守纪律的人得到验证和授权他们取得“中心地位”的身份认同。他说“我们需要更加清晰明确地描述、分析和论证上述现象与当时的启蒙式的社会进程之间的紧密纽带”，这是该书的核心议题。也就是说，要打破在文明与堕落、启蒙与颓废之间贴标签的划分方法，不是简单地歌颂启蒙或批判颓废，而是要揭示在两者之间相互联系和相互塑造的真实联系——这才是隐藏在“世纪末时期柏林和维也纳的地下世界”中最核心的秘密。如果说到身份认同的问题，斯佩克特要揭示的正是内在于启蒙与文明所自我建构的高大形象之中的violent sensations——有关暴力的感官刺激、丑闻事件和边缘堕落真相，它们同样就是现代性身份认同中无法割离的一部分。
    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-53&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-54&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        关于“启蒙与颓废”，在斯佩克特的论述中是这样引进来的：“在本书中，笔者认为，这样一种双重的分析具有重要作用：它涉及中欧社会的现代性的自我印象，它涵盖了那些‘启蒙的’(enlightened)与‘颓废的’(decadent)的实践和表征。此等分析的前提是对迥然不同的文本类型的深层信息进行比较研究，这些文本包括：法学、医学以及社会科学等学科的学术文献和其他文本；警察、法官以及侦探的专门记录和专业手册，乃至法庭记录；哲学和文学等以受过教育的群众为受众的高雅文化文本；低俗小说和讽刺杂文等大众文化作品；报刊报道和新兴的犯罪和侦探小说等寻求感官刺激的罪案报道；政治解放运动的文献和档案；最后，一些罕见的记载了性犯罪者个人经历的档案，例如法庭审判记录、警方审讯笔录、私人笔记文件以及给友人、医生或者报刊编辑的书信等。”（4页）这里相当详细地列举了作者的研究所依据的第一手史料，对于不太熟悉产生这些史料文本的历史语境的读者来说，要有足够的耐心才能读进去；同时还会遇到理解的困难——斯佩克特对这些案例的分析和研究把叙事与评述、考证与思辨、感性与理性融为一体，需要读者在阅读中细心分辨和领悟。
    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-54&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-55&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        对于研究者来说，我们在阅读中还会发现在我们自己的研究中所谓作为方法的“文本细读”还存在不少文本类型的盲区。比如说关于性丑闻的文本，我们往往由于各种语境的限制而难以“细读”，更无法“重述”。当我们读到斯佩克特关于性丑闻文本的这段论述之后，应该会有所触动：“在很大程度上，性丑闻是一座桥梁……确实，丑闻是一个不同的知识语域（register）……丑闻本身也是再现的阵列中的一股积极力量……1907年，哈登—奥伊伦堡事件（Harden-Eulenburg Affair）是同性恋性丑闻达到高潮的标志。皇帝的亲信顾问的小圈子涉嫌同性恋，这起丑闻引发了德意志帝国政权的震动。20世纪的头十年里。报纸报道的这一系列的丑闻的特点是文化幻想，这些文化幻想的主要内容不是可怕的行径或极端的暴力，而是外国渗透、阴谋诡计、颠覆政权和贪污腐败。这些感官猛料暴露出一种隐秘的反社会暴力，在它背后还潜藏着一种秘密的反常现象。”（177—178页）毫无疑问，这的确是猛料（sensations），是暴露帝国政权的秘密和反常现象的有力文本。能够把性丑闻与“外国渗透、阴谋诡计、颠覆政权和贪污腐败”联系在一起的文本，无论在何种历史语境中都值得“细读”和“重述”。“由此，我们可以另辟蹊径地揭示目前人们尚未深究过的历史背景。”（5页）——把导言中的这句话放在这里，也很合适。
    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-55&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-56&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        &lt;p&gt;另外，在对边界人物、暴力幻想、性和犯罪的文本研究中，米歇尔·福柯在这些议题中的理论观念当然对斯佩克特有重要影响。他指出福柯在《性经验史》（History of Sexuality）中坚持主张在性主体或者自我理解、解放运动以及具有潜在压迫性和权威性的医学话语和法学话语之间存在联系，但是福柯的实际分析的重点几乎只是关于权威性的话语。（22页）因此，“本书将大众文化中那些刺激感官的猛料文本置于学术话语、政治话语和哲学话语的对立面，这样也许能让人们采用不同的方式认识横跨19世纪晚期到20世纪早期那些令人百思不得其解的思想执念，并如此看待这种复杂的机制：它作为一种文化项目或一种关于现代性的、属于现代性的自我批判话语发挥作用”。（23页）&lt;/p&gt;
&lt;p&gt;正是在这样的视角和研究进路之中，斯佩克特提出了对于当前文化史研究的重点转移——在我看来也可以说是范式转移——的看法：其研究对象已经不再限于高雅文化的文本，而是涉及高雅文化的话语（哲学的、批判的、美学的、文学的、科学的或社会科学的各方面的话语）和发生“在地面上”的主体的理论化进程之间的历史联系。所谓“地面上的理论化进程”包括：警察的实践、激进分子的实践、罪犯的实践和“普通人“的实践。“为了复原这一饱和的历史时刻，人们需要理解各种线索和其他事物之间的共谋关系——换句话说。启蒙运动同内在于它自身的那种灾难性的对立面共舞，人们不可能‘选边站’在理性的启蒙运动一边，清除这种危险的关系。即使我们门小心翼翼地讲述这段历史，也可能会唤醒这头野兽。……人们只能希望自己在面对下文将要谈到的那些刺激感官的暴力幻想的诱人景象时，能够保持足够的警觉，从而维持分析层面的精确。”（24页）&lt;/p&gt;

    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-56&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-57&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        也就是说，与启蒙话语共舞的不仅是对未来的乐观想象，同时还有在地下世界中奔涌的“暴力感官”和“暴力猛料”。在这样的视角中解读罗伯特·穆齐尔的小说《没有个性的人》（The Man without Qualities），揭示其真正的故事背景是世纪末时期的维也纳，他所讲述的故事与本书所要阐述的论题紧密相关，那就是：我们对世纪末的人们的幻想的观察穿过魏玛共和国时代和紧随其后的纳粹德国时代的透镜产生了折射，在此情况下阅读他们自身所处时代的人们的幻想的深层结构。”（14页）既然谈到了魏玛时期和纳粹德国时代，对于在“启蒙与颓废”之间与狼共舞的历史追问就涉及到一个有关一次大战的重要议题：根据传统说法，走入战争的各国欧洲人从来没有预见到大战的灾难性暴力，因此暴力幻想是第一次世界大战之后才产生的血腥产物。但是斯佩克特的研究提出了不同的看法：“如果说第一次世界大战前几十年，灾难性、报复性和潜伏性的暴力幻想已经出现，我们又应该如何看待这种因果关系的轨迹？”（21页）他提出的问题是：“是否存在一种可能，第一次世界大战不是现代人暴力幻想的起因，而是其暴力幻想的症状甚至后果呢？”（22页）如果是的话，那么根据作者对于世纪末时期柏林和维也纳的“启蒙与颓废”的研究，正是那些接受启蒙思想并且积极发展科学事业的思想家、科学家和那些在边缘地带争取身份认同的地下世界群体的“共舞”而使暴力幻想成为形塑战争暴力的文化根源。在我看来这也只是在都市研究中的文化心理分析与历史社会学之间的一种有意义的探索，涉及到战争史的问题还需要回到战争史叙事中接受检验，那些在战壕中产生的士兵日记、作战实录、从前线飞向后方的家书等文本才是揭示最后答案的依据。
    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-57&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-58&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        这不仅是非常重要的关于暴力史的重构、重述，而且更是对世界的今天与未来发展的前瞻和深刻警醒。作者在最后指出：“众所周知，20世纪初的时代戛然而止，人们没有迎来乌托邦式的未来，而是遭遇了史无前例的暴力。在这些幻想中，世界末日一般的暴力比比皆是，指向极端暴力的强烈冲动体现出当时中欧社会的一种想象，人们认为，与这种想象联系密切的不是历史上的围绕宗教和幸福的审美花园，而是间战时期德国社会的右翼男性幻想。如果说这条联系体现出一条从19世纪的自我感知出发，到20世纪的血腥暴力结束的道路，那么一种对人们有所帮助的思路则是促使人们认识到，这条道路并不是唯一可能的轨道。”（385页）这当然是很有帮助的思路，也可以完全同意作者的结论：通向20世纪所有那些极端残忍、血腥的暴力事件的绝不是只有唯一的道路，各种话语、身份认同和群体意识都有可能带着魔鬼的面具吞噬无辜的生命。我们对于这样的历史叙事也早已有所认识。
    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-58&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;
&lt;h3 id=&#34;失踪多年被拐骗进黑砖厂做苦力的智障男工&#34;&gt;失踪多年，被拐骗进黑砖厂做苦力的智障男工
&lt;/h3&gt;&lt;div class=&#34;note-card&#34;&gt;
    &lt;div class=&#34;nc-accent&#34;&gt;&lt;/div&gt;

    &lt;div class=&#34;nc-header&#34;&gt;
        &lt;div class=&#34;nc-meta&#34;&gt;
            &lt;span class=&#34;nc-badge&#34;&gt;READING&lt;/span&gt;
            &lt;span class=&#34;nc-date&#34;&gt;2025-10-19&lt;/span&gt;
        &lt;/div&gt; &lt;a href=&#34;http://weixin.sogou.com/weixin?type=2&amp;amp;query=%E4%B8%89%E8%81%94%E7%94%9F%E6%B4%BB%E5%91%A8%E5%88%8A&amp;#43;%E5%A4%B1%E8%B8%AA%E5%A4%9A%E5%B9%B4%EF%BC%8C%E8%A2%AB%E6%8B%90%E9%AA%97%E8%BF%9B%E9%BB%91%E7%A0%96%E5%8E%82%E5%81%9A%E8%8B%A6%E5%8A%9B%E7%9A%84%E6%99%BA%E9%9A%9C%E7%94%B7%E5%B7%A5&#34; target=&#34;_blank&#34; class=&#34;nc-title&#34; title=&#34;访问原文&#34;&gt;
            失踪多年，被拐骗进黑砖厂做苦力的智障男工
            &lt;svg class=&#34;nc-link-icon&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
        &lt;/a&gt;
    &lt;/div&gt;

    
    &lt;div class=&#34;nc-context&#34;&gt;
        &lt;div class=&#34;nc-quote-icon&#34;&gt;“&lt;/div&gt;
        &lt;div class=&#34;nc-summary-text&#34;&gt;近年来，一些精神残疾男性在失踪多年后，被发现在黑砖厂工作。这些工厂剥削弱势群体。尽管进行了打击，但由于工厂追求利润和监管不力，这个问题仍然存在。受害者往往缺乏举报虐待的能力，而法律保护和支持系统也不足。一些受害者被欺骗并被迫在恶劣的条件下工作，凸显了对残疾人的社会支持的缺乏。&lt;/div&gt;
    &lt;/div&gt;
    

    
    
    
&lt;/div&gt;

&lt;style&gt;
     
    .note-card {
         
        --nc-bg-card: #ffffff;
        --nc-border: rgba(0,0,0,0.04);
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.08);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.12);
        
        --nc-title: #2c3e50;
        --nc-title-hover: #3a7bd5;
        --nc-meta: #999999;
        
        --nc-bg-context: #f8f9fa;
        --nc-border-context: #e2e8f0;
        --nc-quote-icon: #e2e8f0;
        --nc-text-summary: #555555;
        
        --nc-label-bg: #ffffff;
        --nc-label-text: #2d3748;
        --nc-content-text: #2d3748;
        --nc-link-icon: #cbd5e0;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.1);
        --nc-badge-text: #3a7bd5;

        position: relative;
        background: var(--nc-bg-card);
        border-radius: 12px;
        box-shadow: var(--nc-shadow);
        margin: 2.5rem 0;
        overflow: hidden;
        border: 1px solid var(--nc-border);
        font-family: inherit; 
        transition: transform 0.3s ease, box-shadow 0.3s ease, background 0.3s, border-color 0.3s;
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .note-card {
            --nc-bg-card: #1e1e1e;
            --nc-border: #333333;
            --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
            --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
            
            --nc-title: #f0f0f0;
            --nc-meta: #999999;
            
            --nc-bg-context: #252525;
            --nc-border-context: #444444;
            --nc-quote-icon: #333333;
            --nc-text-summary: #aaaaaa;
            
            --nc-label-bg: #1e1e1e;
            --nc-label-text: #cccccc;
            --nc-content-text: #dddddd;
            --nc-link-icon: #666666;
            
            --nc-badge-bg: rgba(58, 123, 213, 0.2);
        }
    }

    html[data-scheme=&#34;dark&#34;] .note-card {
        --nc-bg-card: #1e1e1e;
        --nc-border: #333333;
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
        
        --nc-title: #f0f0f0;
        --nc-meta: #999999;
        
        --nc-bg-context: #252525;
        --nc-border-context: #444444;
        --nc-quote-icon: #333333;
        --nc-text-summary: #aaaaaa;
        
        --nc-label-bg: #1e1e1e;
        --nc-label-text: #cccccc;
        --nc-content-text: #dddddd;
        --nc-link-icon: #666666;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.2);
    }

    .note-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--nc-shadow-hover);
    }

     
    .nc-accent {
        height: 4px;
        background: linear-gradient(90deg, #3a7bd5, #00d2ff); 
        width: 100%;
    }

     
    .nc-header {
        padding: 24px 28px 10px; 
    }

    .nc-meta {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 10px; 
        font-size: 13px; 
        color: var(--nc-meta);
        font-weight: 600;
        letter-spacing: 1px;
        text-transform: uppercase;
    }

    .nc-badge {
        color: var(--nc-badge-text);
        background: var(--nc-badge-bg);
        padding: 2px 6px;
        border-radius: 4px;
    }

    .nc-title {
        display: block;
        font-size: 2rem; 
        font-weight: 700;
        color: var(--nc-title);
        text-decoration: none;
        line-height: 1.3;
        transition: color 0.2s;
    }

    .nc-title:hover {
        color: var(--nc-title-hover);
    }

    .nc-link-icon {
        width: 20px; 
        height: 20px;
        color: var(--nc-link-icon);
        margin-left: 5px;
        vertical-align: middle;
        transition: color 0.2s;
    }

    .nc-title:hover .nc-link-icon {
        color: var(--nc-title-hover);
    }

     
    .nc-context {
        margin: 12px 28px 24px;
        background: var(--nc-bg-context);
        padding: 20px 24px;
        border-radius: 8px;
        position: relative;
        border-left: 4px solid var(--nc-border-context);
        transition: background 0.3s, border-color 0.3s;
    }

    .nc-quote-icon {
        position: absolute;
        top: 8px;
        left: 10px;
        font-family: serif; 
        font-size: 40px;
        line-height: 1;
        color: var(--nc-quote-icon);
        pointer-events: none;
        transition: color 0.3s;
    }

    .nc-summary-text {
        font-size: 1.7rem; 
        color: var(--nc-text-summary);
        line-height: 1.6;
        font-style: italic;
        position: relative;
        z-index: 1;
        padding-left: 15px; 
        transition: color 0.3s;
    }

     
    .nc-body {
        padding: 0 28px 32px;
        position: relative;
    }

     
    .nc-label {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        font-size: 13px; 
        font-weight: 700;
        color: var(--nc-label-text);
        background: var(--nc-label-bg);
        padding-right: 10px;
        margin-bottom: 12px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
        transition: color 0.3s, background 0.3s;
    }

    .nc-content {
        color: var(--nc-content-text);
        font-size: 1.6rem; 
        line-height: 1.75;
        transition: color 0.3s;
    }

     
    .nc-content p { margin-bottom: 1em; }
    .nc-content p:last-child { margin-bottom: 0; }
    
    .nc-content ul { padding-left: 20px; color: inherit; }
    .nc-content li { margin-bottom: 6px; }
&lt;/style&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-60&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        &lt;p&gt;湖北省监利市的袁雨晴是在9月9日下午接到村支书的电话，说失踪七年的弟弟袁水平找着了，过几天警方会把他送到当地的救助站。听到这个消息，45岁的袁雨晴“眼泪都冒出来了”。挂断电话，她立刻在亲人群里告诉大家这个好消息，所有人都不敢相信，发出的语音消息都带着哭腔。&lt;/p&gt;
&lt;p&gt;袁雨晴说，弟弟44岁，有轻度智力障碍，七年前外出打工后就失联了。巧合的是，接完电话袁雨晴就刷到了一个短视频，一个打拐志愿者在湖南省祁阳市三口塘镇鸿鑫砖厂内，报警称该砖厂存在利用智障人员非法务工的情况，当地警方在现场找到了六名疑似智障人员。袁雨晴一下子就在视频里认出了弟弟——虽然瘦了一大圈，头发看上去很长时间没剪，都竖起来了，憔悴许多，但样貌轮廓整体没变，仍然是有棱角的方脸，鼻梁高挺，说话轻声细语，带着老家的口音。视频里，他对记者说“（砖厂）没给过他钱，（挨）打得不多，头上有个鼓包”。袁雨晴这才知道弟弟是被黑砖厂控制了。她把这个视频发在亲人群，大家又炸开了锅，激动的心情里掺入不可遏制的愤怒和心痛。&lt;/p&gt;

    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-60&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-61&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        当时周围有很多人——救助站的工作人员、警察、记者，袁水平不肯认大家，一直说自己叫宋铜仁，是重庆人。袁雨晴等人不断告诉他不要怕，袁水平这才把亲人认了出来，说砖厂的人没收了他的身份证，给他“洗脑”，说他叫“宋铜仁”，重庆人。“他被打怕了。”袁雨晴说，和他们说话时，弟弟的两个手总是抱在胸前，双腿发抖。弟弟告诉她，“只要不听话就会被打”。袁雨晴说，弟弟失踪前有130多斤，现在看着只有100斤左右，身上还有很多伤痕，一条一条的。袁水平向他们描述，如果他们生病了，砖厂的人只给他们吃止痛药，如果活干得不好，或病得不行了，就扔到高速路上、沟里去。
    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-61&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-62&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        &lt;p&gt;6月29日，谢静静走失九年的父亲也回到了家里。那天下午，在北京打工的她接到大队会计的电话，让她辨认微信上的照片是不是她的父亲寇聚合。父亲56周岁，照片上的这个人“特别老”，看上去像七八十岁的样子，“头发全白了，牙也掉光了，脸色发黄”，但确实是父亲。等她赶回去见了面，真人比照片上看上去还要憔悴和苍老，“一米八的个子，瘦得像竹竿。走起路来像要倒似的”。看着父亲手掌上铺着一层厚厚的老茧，身上好多地方有圆形的和一条一条的、像被抽打过的疤痕，谢静静止不住地哭泣。&lt;/p&gt;
&lt;p&gt;回到家以后，谢静静发现父亲几乎每天都只睡两三个小时，最长没超过五个小时，其余的时间都在客厅转来转去，白天则一直在找活干。“家里长时间没人住，野草长得特别高，他都给刨了。院子里残留着很多盖房子拉来的土，他也全给摊平。这些都干完了，他就一遍又一遍地擦地。”谢静静劝他不要干，寇聚合却训她：“你这闺女是不是魔怔了？盖大楼呢，光（叫我）歇歇歇，咋盖呢？是不是脑子坏掉了？”谢静静觉得，他大概是用别人训他的话来训她了。&lt;/p&gt;
&lt;p&gt;谢静静迫切地想知道这九年里父亲去了什么地方，可患有精神疾病的寇聚合难以准确回忆这九年的遭遇，他只记得自己去过好几家砖厂，具体的名字说不上来。他提到，在砖厂的日子，他“没日没夜地干，不干活要被打，干得慢也要被打”。谢静静相信父亲的说法。2000年左右，父亲也走失过一次，半年后自己回来，他穿一双又小又破的鞋，说是逃跑的时候把鞋跑丢了，路上捡了一双。父亲当时也说自己被人“捞”去了砖厂。&lt;/p&gt;

    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-62&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-63&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        &lt;p&gt;在父亲破碎的描述里，谢静静大致了解了父亲回来的过程。父亲说砖厂的人让他回家休息几天，随后开车把他带到一条公路上，对他说沿路一直走20多公里就到家了。那天下着大雨，气温35摄氏度以上，他上身穿着一件T恤，下身穿一条加绒的裤子，就这么淋着雨走。“估计是嫌他干活慢了。”&lt;/p&gt;
&lt;p&gt;谢静静觉得愤怒，想要为父亲讨一个公道。谢静静和哥哥先去派出所报警，对方说要去案发地报警才能立案。寇聚合是从哪里回来的，他自己也不知道。他只记得从砖厂出来后，在车上看到路边有“民权”“兰考”的路牌，还看到“焦裕禄纪念园”。除此之外，寇聚合还记得厂里生产的是红砖、青砖，还有“用大石头磨的面（做砖用的石粉）”。&lt;/p&gt;
&lt;p&gt;根据这些内容，谢静静查了一夜的信息，最后锁定了三家砖厂。第二天一早，她和哥哥带着父亲出发了，但父亲都说不是。下午快4点时，谢静静和哥哥决定去附近的砖市碰碰运气。砖市就在马路边上，三轮车一辆挨着一辆，拉来的砖整整齐齐地码在边上。一位拉砖师傅认出了寇聚合，说给他装过砖，但具体是在哪个厂他忘记了。“他还说山东以及河南商丘、开封一带的砖厂那几年用的全是智力不正常的人，过一段时间换一批，来回换。”谢静静觉得看到了希望。&lt;/p&gt;
&lt;p&gt;下午6点多，赶来的警察带他们排查了附近的四个砖厂。前三个砖厂都很偏僻，有的甚至在庄稼地里，寇聚合都说不是。最后一个砖厂是在距离县政府仅一公里处的兴兰建材。从外观看，谢静静觉得这不会是一家黑砖厂，厂子很大，贴了瓷砖的四层楼，窗户是蓝色的，擦得干净明亮，空地也都打扫得很干净，“太光鲜亮丽了”。父亲先是说像，再靠近一些，看到多边形的砖时又说“不是，没生产过这个砖”。谢静静坚持再进去看看，“来都来了”。进门往左拐，寇聚合认出了栅栏内栽的一排竹竿，“高高的，尖尖的”，情绪一下激动起来，说“就是这里”：他住在三栋楼中间那一栋，三楼第一间。&lt;/p&gt;
&lt;p&gt;看到父亲宿舍的环境，谢静静就又哭了：拥挤狭小的空间里，靠墙摆了六张宽一米左右的床，紧挨着，被子又脏又乱，黑乎乎的，结了块似的。有的床没有床垫，只是一张破了洞的床板，空气里弥漫着一股非常难闻的味道。随后，民警从兴兰建材解救了数名工人。谢静静拍下了他们的照片，全都身材瘦削，有些无措地站着。谢静静说，他们和父亲差不多，都“呆滞，说不清楚话”。警方告诉谢静静，2020年至今，寇聚合先后被转卖过河南省内四家砖厂，先是到了郑州市管城区的一个砖厂（今年6月这家砖厂已经被警方打击关闭），2023年被卖给一个姓蔡的人，最后来到兴兰建材。&lt;/p&gt;

    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-63&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-64&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        &lt;p&gt;民间打拐志愿者上官正义是从今年开始关注到黑砖厂非法用工的。他告诉本刊，6月4日至今，他已解救不少残障人员，年龄最小的才22岁，最大的超过60岁。失踪时间最长的有30多年，户籍都已被注销，最短的6年。控制残障人员的公司和个体户包括砖厂、水泥厂（经销商）、养殖场等，分布在全国多个省市。他说，这些黑工厂通常都建在农村，位置比较偏远，但交通比较便利的地方。例如，他探访的首个砖厂——湖南省临湘市艳飞砖厂两面靠山，只有一条路与外界往来，和他一同探访艳飞砖厂的一名记者告诉本刊，“一般人不会过去”。&lt;/p&gt;
&lt;p&gt;上官正义说，如今砖厂已经实现半自动化，但最后一个装砖的环节仍然需要人工，这些智障工人负责把成品砖码整齐，垒成一个一个小垛子，包扎起来，“他们只能干这类重复、机械的苦力活”。上官正义看到的砖厂，生意都还不错，装砖的人要不停地干，岗位的工资因此也不低，每天能有400元。但和工头交流的时候，工头告诉他，“一般人不会做这个工作，给多少钱都不干”——环境里都是高温和粉尘，日后患职业病的风险比在普通工厂高几倍。&lt;/p&gt;
&lt;p&gt;在解救的过程里，上官正义发现，黑砖厂的“目标”是轻度的智力障碍者，“他们不能完全没有行为能力，那样就无法控制他们的行为”。陕西慧灵智障人士服务机构（以下简称“陕西慧灵”）总干事蔡景华告诉本刊，十多年前他们也接收过从黑砖厂出来的服务对象，之所以能出来，是因为不管工头怎么骂他、打他，他都不干活。晚上所有人睡觉的时候，他把厨房里的油和醋倒了，把砖推倒，砖厂的人受不了，把他扔到镇上才被警察发现。&lt;/p&gt;
&lt;p&gt;对于在里面工作的智障工人，工头有一套冠冕堂皇的说辞，“我看他在路边乞讨、捡垃圾，把他带到这里来，给他一份工作、一口饭吃”“他自己找工作找到这里来了”。上官正义说，其实很多人是被拐骗来的。&lt;/p&gt;

    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-64&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-65&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        &lt;p&gt;看到最近黑砖厂的新闻，湖南金州（湘潭）律师事务所律师王莹觉得非常震惊。2007年，山西黑砖窑被媒体曝光，引发舆论风暴。王莹曾为从黑砖厂被解救出来的智障工人提供法律援助。她告诉本刊，当时国务院成立联合工作组赴运城、临汾、晋城调查督办，山西省委省政府于2007年6月15日下发《关于开展整治非法劳动用工和打击“黑砖窑”专项行动通知》。据央视新闻2007年6月24日报道，山西公安系统出动4万多警力，检查小砖厂、小采矿厂、小冶炼厂8760处。截至当日，全省解救农民工359人，其中被拐骗的174人，被强迫劳动的185人，包括65名智障人员、12个未成年人。这之后，全国范围内又开展了为期两个月的整治非法用工、打击违法犯罪专项行动。“我以为不会再出现这样的事情了。”王莹说。&lt;/p&gt;
&lt;p&gt;慧灵创始人孟维娜告诉本刊，“在农村，女性中的智力和精神障碍者被看中的是生育能力，而男性智力和精神障碍者则容易变成劳动的工具。他们除了体力，没有别的技能。而且他们表达能力弱，难以清晰地陈述自己的经历并为自己维权，容易被控制。”在王莹看来，黑砖厂之所以长期存在，首先是因为砖厂追逐利润，“用智障工人的成本相当于0。在某一个地区，如果一个砖厂这样用工，降低了成本，在市场上有价格优势，那么别的砖厂自然也要想办法降低成本，效仿这种方式”。&lt;/p&gt;
&lt;p&gt;王莹说，法律上对于以非法拘禁或强迫劳动方式使用智力障碍人员务工，有相应的规制，根据不同情节通常会对违法者判处“强迫劳动罪”或“非法拘禁罪”。即使不构成刑事犯罪，也要承担行政责任和民事责任。但一些砖厂对这些法律法规规定的明确惩罚抱有侥幸心理——从她2007年前往山西的实地走访经历来看，当地很多人都知道非法用工的存在，但出于害怕被找麻烦的心理，没有人想到要解救智障工人。如果不被发现，就不会被追究责任。王莹认为，更主要的原因是监管的疏忽，黑砖厂所在地执法部门的主动性不强，“劳动监察部门或者公安部门，往往是接到投诉或报案之后才去查处，主动去了解企业是否合法用工的比较少”。&lt;/p&gt;
&lt;p&gt;王莹认为，司法上的保护也不够，例如根据《刑法》第244条，以暴力、威胁或者限制人身自由的方法强迫他人劳动的，处三年以下有期徒刑或者拘役，并处罚金；情节严重的，处三年以上十年以下有期徒刑，并处罚金。“量刑比较轻，买卖人口的实质也被掩盖了。”王莹告诉本刊，她曾提供法律援助的对象在2007年以前于多个黑砖厂工作过，她认为这背后很可能存在买卖链条，但目前国内《刑法》没有“拐卖人口罪”，1997年修正《刑法》时，考虑到在现实中拐卖妇女、儿童的情况更常见，而拐卖成年男性或双性人的较少见，所以将“拐卖人口罪”修改成了“拐卖妇女、儿童罪”，体现对这两类弱势群体的特别保护。然而现在看来，这也导致黑砖厂的违法成本较低。&lt;/p&gt;

    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-65&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-66&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        &lt;p&gt;袁水平失踪，是因为外出打工。袁雨晴说袁水平是在2014年左右诊断出间歇性精神失常，属于一级精神残疾。当时他打游戏输了钱，又和老婆离了婚，袁雨晴猜测，他是因为精神压力大才得了病。他发病的时候脾气比较暴躁，会骂父母，但不会打人。袁雨晴的父母生了六个孩子，袁水平最小，又是唯一的男孩，大家对他都看得很重。弟弟生病后，离得近的大姐平时会回家照看弟弟和父母。&lt;/p&gt;
&lt;p&gt;2018年，大姐患肺癌去世，时年37岁的袁水平就提出自己要去广州打工挣钱，供养父母。一家人对此没有太大的担心——他不是第一次去广州，袁水平高中毕业就学裁缝手艺，得病前在广州做衣服。让他外出更多是因为家里穷，“生病了也要赚钱”“在我们村里，这样的人还有不少”。袁雨晴说，弟弟走后，给他打电话打不通，手机停机。家人是在他失联一年后才去广州报的警。“有时候去外面打工，一两年不回来蛮正常的。而且我们也都有自己的日子要过。”袁雨晴说。&lt;/p&gt;

    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-66&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-67&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        &lt;p&gt;在北京民政局登记注册的非公募基金会北京市晓更助残基金会（以下简称“晓更基金会”）一直关注农村心智障碍群体，其副秘书长刘丽伟告诉本刊，根据2006年第二次全国残疾人抽样调查数据，农村智力残疾人约460.65万人，农村精神残疾人约448.2万人。陕西慧灵总干事蔡景华告诉本刊，真正进入农村后，智力和精神障碍群体的数量比他们想得要多。&lt;/p&gt;
&lt;p&gt;“每个村子四五个是有的。重度的智力和精神障碍患者一般都被关在家里，轻度的智力和精神障碍患者则由亲戚朋友带着，帮家里干一些农活，比如收核桃、水果，或者做一些小工，搬沙子、搬砖之类。”蔡景华说，尤其是在秋收季节，虽然他们的劳动效率不如普通人高，但家庭还是需要他们成为劳动力。“农村妇女干一天活的工资是200元，他们一般一天只有三五十元。能叫上他们、带他们去干活的人还算好的，很多人都不愿意让他们干。”对于智力和精神障碍群体，村民们更加倾向于不主动来往，也会有人嘲讽、歧视他们。家里有智力和精神障碍人士的村民也会有自卑感。&lt;/p&gt;
&lt;p&gt;谢静静告诉本刊，父亲寇聚合在她出生之前就患有二级精神残疾，原因是打井的时候掉了下去，摔到了头。在此之前，父亲和母亲一起卖煤，得病后他就不再干活了，在家“吃吃睡睡，抽烟”。父亲每个月都要发几次病，发病的时候会打人，她和妈妈、哥哥都被打过，“打哥哥打得最狠，拳打脚踢，不分地方的”。只要一见父亲有打人的动作，谢静静和哥哥就赶紧往外跑，到邻居家去喊人拉架。最严重的时候，父亲开始烧家里的东西，“衣服、被褥、床、窗户、门，所有能烧的东西都拖到院子里，拆了、砸了、点着，消防车都来了好几次。后来母亲只好带着兄妹两人去亲戚家轮流住，隔几天去给父亲送点吃的。在寇聚合的记忆里，2016年6月的一天，他在紧邻公路的村口逛时，被几个人拉上了车。&lt;/p&gt;

    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-67&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-68&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        &lt;p&gt;在蔡景华看来，某种程度上，这也是农村家庭缺乏专业监护意识的表现。蔡景华在服务点看到，农村家庭的劳动力几乎都外出打工了，剩下的都是老人、妇女、儿童和残障人士，残障人士照顾的责任基本落在老人身上。但他们也需要下地干活，忙家务，没有太多精力照顾他们，也没有让他们融入社会的意识。“在他们的观念里，把孩子养育长大，让他吃饱穿暖就足够了，不会想到培养他们就业的技能，帮助他们融入周围的环境。不像城市的家长，能够意识到作为一个人，哪怕是残障人士，也有出门活动，和人接触的需求。”孟维娜说，2020年之前，慧灵帮扶对象主要为城市的成年智力障碍人士，2020年以后，他们开始将工作向农村延伸。一开始，蔡景华觉得过去在大城市积累的社区化模式的经验，仿佛一下子失灵了。“你要给他们提供服务，他们不知道服务是什么，觉得不需要。”&lt;/p&gt;
&lt;p&gt;孟维娜说，更大的困难在于，相对于农村残障人士的数量，服务机构的数量仍然很少，服务仍然不普及。晓更基金会秘书长李红颖形容，“就像一个黑灯区，资源和服务非常稀缺”。从另一个角度考虑，孟维娜告诉本刊，背后也有残障人士社会支持体系不足的原因。“一些轻度的智力障碍者有就业的能力，但是没有人给他介绍、提供就业的岗位和辅导，当正规的就业服务缺位，这些‘无处可去’的人就有可能被骗或被强行带去不合规的工厂。”&lt;/p&gt;
&lt;p&gt;回家以后，寇聚合仍然时不时地自己去附近转，不让谢静静跟着，一看见她跟着就呵斥。9月初，寇聚合又走丢了两三天，找到他以后，他说是自己出去重新找地方盖房子。谢静静现在还是不敢和父亲住在一起，晚上回妈妈那里住。她在家里安了监控，也给爸爸买了定位器。&lt;/p&gt;

    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-68&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;
&lt;h3 id=&#34;邹贺评如临大敌听与信之间谣言呈现的宋代历史&#34;&gt;邹贺评《如临大敌》｜听与信之间：谣言呈现的宋代历史
&lt;/h3&gt;&lt;div class=&#34;note-card&#34;&gt;
    &lt;div class=&#34;nc-accent&#34;&gt;&lt;/div&gt;

    &lt;div class=&#34;nc-header&#34;&gt;
        &lt;div class=&#34;nc-meta&#34;&gt;
            &lt;span class=&#34;nc-badge&#34;&gt;READING&lt;/span&gt;
            &lt;span class=&#34;nc-date&#34;&gt;2025-10-19&lt;/span&gt;
        &lt;/div&gt; &lt;a href=&#34;https://www.thepaper.cn/newsDetail_forward_31751175&#34; target=&#34;_blank&#34; class=&#34;nc-title&#34; title=&#34;访问原文&#34;&gt;
            邹贺评《如临大敌》｜听与信之间：谣言呈现的宋代历史
            &lt;svg class=&#34;nc-link-icon&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
        &lt;/a&gt;
    &lt;/div&gt;

    
    &lt;div class=&#34;nc-context&#34;&gt;
        &lt;div class=&#34;nc-quote-icon&#34;&gt;“&lt;/div&gt;
        &lt;div class=&#34;nc-summary-text&#34;&gt;黄波的《面对强敌》考察了宋代 1054 年的“甲午之乱”谣言。该书探讨了官员和皇帝如何看待和应对以四川动荡为中心的谣言。它强调了理解公众情绪和操纵的可能性，并总结说，谣言最终反映了现有的社会紧张关系。&lt;/div&gt;
    &lt;/div&gt;
    

    
    
    
&lt;/div&gt;

&lt;style&gt;
     
    .note-card {
         
        --nc-bg-card: #ffffff;
        --nc-border: rgba(0,0,0,0.04);
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.08);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.12);
        
        --nc-title: #2c3e50;
        --nc-title-hover: #3a7bd5;
        --nc-meta: #999999;
        
        --nc-bg-context: #f8f9fa;
        --nc-border-context: #e2e8f0;
        --nc-quote-icon: #e2e8f0;
        --nc-text-summary: #555555;
        
        --nc-label-bg: #ffffff;
        --nc-label-text: #2d3748;
        --nc-content-text: #2d3748;
        --nc-link-icon: #cbd5e0;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.1);
        --nc-badge-text: #3a7bd5;

        position: relative;
        background: var(--nc-bg-card);
        border-radius: 12px;
        box-shadow: var(--nc-shadow);
        margin: 2.5rem 0;
        overflow: hidden;
        border: 1px solid var(--nc-border);
        font-family: inherit; 
        transition: transform 0.3s ease, box-shadow 0.3s ease, background 0.3s, border-color 0.3s;
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .note-card {
            --nc-bg-card: #1e1e1e;
            --nc-border: #333333;
            --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
            --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
            
            --nc-title: #f0f0f0;
            --nc-meta: #999999;
            
            --nc-bg-context: #252525;
            --nc-border-context: #444444;
            --nc-quote-icon: #333333;
            --nc-text-summary: #aaaaaa;
            
            --nc-label-bg: #1e1e1e;
            --nc-label-text: #cccccc;
            --nc-content-text: #dddddd;
            --nc-link-icon: #666666;
            
            --nc-badge-bg: rgba(58, 123, 213, 0.2);
        }
    }

    html[data-scheme=&#34;dark&#34;] .note-card {
        --nc-bg-card: #1e1e1e;
        --nc-border: #333333;
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
        
        --nc-title: #f0f0f0;
        --nc-meta: #999999;
        
        --nc-bg-context: #252525;
        --nc-border-context: #444444;
        --nc-quote-icon: #333333;
        --nc-text-summary: #aaaaaa;
        
        --nc-label-bg: #1e1e1e;
        --nc-label-text: #cccccc;
        --nc-content-text: #dddddd;
        --nc-link-icon: #666666;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.2);
    }

    .note-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--nc-shadow-hover);
    }

     
    .nc-accent {
        height: 4px;
        background: linear-gradient(90deg, #3a7bd5, #00d2ff); 
        width: 100%;
    }

     
    .nc-header {
        padding: 24px 28px 10px; 
    }

    .nc-meta {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 10px; 
        font-size: 13px; 
        color: var(--nc-meta);
        font-weight: 600;
        letter-spacing: 1px;
        text-transform: uppercase;
    }

    .nc-badge {
        color: var(--nc-badge-text);
        background: var(--nc-badge-bg);
        padding: 2px 6px;
        border-radius: 4px;
    }

    .nc-title {
        display: block;
        font-size: 2rem; 
        font-weight: 700;
        color: var(--nc-title);
        text-decoration: none;
        line-height: 1.3;
        transition: color 0.2s;
    }

    .nc-title:hover {
        color: var(--nc-title-hover);
    }

    .nc-link-icon {
        width: 20px; 
        height: 20px;
        color: var(--nc-link-icon);
        margin-left: 5px;
        vertical-align: middle;
        transition: color 0.2s;
    }

    .nc-title:hover .nc-link-icon {
        color: var(--nc-title-hover);
    }

     
    .nc-context {
        margin: 12px 28px 24px;
        background: var(--nc-bg-context);
        padding: 20px 24px;
        border-radius: 8px;
        position: relative;
        border-left: 4px solid var(--nc-border-context);
        transition: background 0.3s, border-color 0.3s;
    }

    .nc-quote-icon {
        position: absolute;
        top: 8px;
        left: 10px;
        font-family: serif; 
        font-size: 40px;
        line-height: 1;
        color: var(--nc-quote-icon);
        pointer-events: none;
        transition: color 0.3s;
    }

    .nc-summary-text {
        font-size: 1.7rem; 
        color: var(--nc-text-summary);
        line-height: 1.6;
        font-style: italic;
        position: relative;
        z-index: 1;
        padding-left: 15px; 
        transition: color 0.3s;
    }

     
    .nc-body {
        padding: 0 28px 32px;
        position: relative;
    }

     
    .nc-label {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        font-size: 13px; 
        font-weight: 700;
        color: var(--nc-label-text);
        background: var(--nc-label-bg);
        padding-right: 10px;
        margin-bottom: 12px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
        transition: color 0.3s, background 0.3s;
    }

    .nc-content {
        color: var(--nc-content-text);
        font-size: 1.6rem; 
        line-height: 1.75;
        transition: color 0.3s;
    }

     
    .nc-content p { margin-bottom: 1em; }
    .nc-content p:last-child { margin-bottom: 0; }
    
    .nc-content ul { padding-left: 20px; color: inherit; }
    .nc-content li { margin-bottom: 6px; }
&lt;/style&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-70&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        在中国古代，异变将生，常有谣言。史籍中所见最早的谣言大约是《史记·周本纪》所载西周时童谣“檿弧箕服，实亡周国”，周宣王因言抓人，引出日后周幽王废申后、立褒姒，及至宗周焚荡，平王东迁等史事。由于中国古代有神论信仰的背景，谣言往往附会着神秘主义的未来预测。所谓“异变”之大者，便是王朝更迭，怎不牵动朝野上下的神经？故今人对谣言抱持的不过是“吃瓜”的娱乐心态，而古代谣言过处，动辄“百姓纷纭”“军中汹汹”，甚或发酵成一时之大事。四川大学黄博副教授新著《如临大敌：谣言恐慌与大宋王朝1054》聚焦宋仁宗皇祐六年（1054，当年三月改元至和）的“甲午再乱”谣言，剖析北宋君臣如何经由听觉——如谣言——获取信息，形成对四川地区的认知、态度及对策，是宋代历史在谣言视角中的独特呈现。
    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-70&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-71&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        &lt;p&gt;谣言的本体是谎言。按《如临大敌》书中对宋代谣言的定义：“主要指民间以歌谣的形式传播和散布的种种说法或议论……常常包含了某些有意无意散布的虚假消息，以及对未来好事的期待或坏事的忧虑。”（155页）通常被包装成童谣、谚语的样式。依常理言之，一则谣言的发生、发展路径，可概括为二：&lt;/p&gt;
&lt;p&gt;路径A：谣言生成并散播→官民鉴别其为假→谣言时效过期而被遗忘；&lt;/p&gt;
&lt;p&gt;路径B：谣言生成并散播→官民相信其为真→引起受众恐慌骚动→官方处置得当或不当→造成新的社会问题…….&lt;/p&gt;
&lt;p&gt;荀子云：“流言止于智者。”此思路属于路径A，即寄望智者运用常识，解构业已流传开来的谣言，以稳定民心。前述周宣王对童谣“檿弧箕服，实亡周国”的处理，则属于路径B。美国学者孔飞力教授（Philip Kuhn）在三十五年前出版的《叫魂：1768年中国妖术大恐慌》（Soulstealers：The Chinese Sorcery Scare of 1768）描述了清乾隆帝如何借由剪辫叫魂案，强化官吏管控，打击民间邪教。虽然该书立论尚存争议——比如未见更多材料，足以佐证乾隆帝在处置该案时蓄意扩大化，故作者有臆断夸大之嫌等——不过，该书也揭示了中国古代谣言传播的第三种可能：在特定的时代、社会、政治、经济、文化等背景下，官府出于维护统治秩序、安抚百姓心理等角度的考量，会搁置谣言真伪，径直采取干预阻断措施。北宋“甲午再乱”谣言，即属此例。&lt;/p&gt;
&lt;p&gt;时移世易，及至北宋，人们对谣言的认识，已经从秦汉时代谶纬之说，所谓天意，下降为人谋。例如宋真宗欲行封禅，需要炮制天书等祥瑞，然而，人造祥瑞还是祥瑞吗？他询问老儒杜镐：所谓“河出图，洛出书，圣人则之”，这些祥瑞，是真是假？杜镐漫不经心地回答：“此圣人以神道设教尔。”先是龙马背负河图从黄河而出，伏羲得以创八卦，又有灵龟背负洛书从洛河而出，大禹据以定“洪范九畴”，于国于民，裨益大焉。因此问题的关键不在于真假，而在于怎样利用。河图洛书如是，谣言亦如是。对于辖地展阔、文化昌明、人心各异的北宋，更须在意的是“流言不能止于智者”，或警惕“谣言起于别有用心者”，即有人“有意无意散布”谣言。&lt;/p&gt;
&lt;p&gt;藉此可以发现，在北宋君臣的认知中，有一个对待谣言的预置前提：谣言的威力，不在于真伪，而在于有人蓄意制造、煽动并利用。这个认知直接决定了对待谣言的态度，《如临大敌》书中列举了张詠、司马池、王曾、张方平等人，他们都提出：平弥谣言负面作用的关键是安抚百姓，而非辨别谣言真伪（当然，不妨碍双管齐下）。换句话说，北宋君臣，尤其是宋仁宗、庞籍、程戡、张方平等“甲午再乱”的当事人，他们在主观上，可能不相信这则源出纪年星象的谣言的真伪，但是在客观上，他们必须相信这则谣言的威力。因为如若不信，意味着坐视这则谣言背后的始作俑者继续摇旗鼓吹，直至谣言产生效果。正如《如临大敌》书中总结北宋君臣之所以相信谣言的原因：“谣言就是舆情。”（398页）相反，部分认不清这个实质的官员，执迷于分辨谣言真假，一旦其人智识不足、经验有限，或者以假为真，如“甲午再乱”的另一当事人高良夫，着力于加强军备、发动百姓，不过是扬汤止沸、推波助澜。或者以真为假，如侬智高之乱中的知广州仲简，他本来已经提前获知侬军前来攻城的消息，但他把真实的军事情报强解为虚假的谣言，把报信者视为造谣者予以抓捕，实为掩耳窃铃、自欺欺人。必然举措失当，铸成大错。&lt;/p&gt;

    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-71&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-72&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        &lt;p&gt;北宋之所以形成这样的谣言观，与其开国史密切相关。明末清初学者王夫之《宋论》分析赵匡胤身为后周军界晚辈，其称帝后的心态是“惧”，也就是后人常说的北宋开国规模不大。既然信心不足，就要为自己的行为找补正当理由，相比于宋真宗东封西祀消耗国帑，成本低廉而效果不俗的谣言，无疑更适合创业初期的北宋君臣。《如临大敌》的《楔子》梳理从“点检做”到契丹、北汉南下军情报告，再到“日下复有一日”等点缀在北宋开国史中的军政谣言。在显性的历史事件背后，必然有隐性的获利者，于不可解释的矛盾中，露出马脚。故此，以上谣言尽皆出于人为，已为古今所公认。&lt;/p&gt;
&lt;p&gt;当最初的别有用心者利用谣言获利后，自会防备出现新的别有用心者，恰好“甲午再乱”谣言的诞生地四川地区，就是北宋君臣心中的异数。《如临大敌》第一章《甲午年的魔咒》的时间线从后唐庄宗同光三年（925）九月开始，皇子李继岌、大将郭崇韬统兵平灭前蜀，事成后数月间，后唐政权爆发一系列内乱，郭崇韬、唐庄宗、李继岌相继死亡，李嗣源继位为唐明宗。与李嗣源地位相当的孟知祥据有四川，维持着与后唐貌合神离的半独立状态。直至后唐应顺元年（934，农历甲午年）明宗去世，孟知祥称帝建后蜀。这样一来，五代时期的四川地区对中原王朝来说，背上了降而复叛的黑历史，是为甲午第一乱。&lt;/p&gt;

    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-72&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-73&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        &lt;p&gt;经过数次战乱，北宋在四川地区采取了一系列针对性措施，如慎选亲民官、授予地方官便宜行事权、赴任不许携家属、不任命蜀籍官员返乡任职、提高支俸待遇、任满奖励升迁，还有善待士人，扩大发解试名额，严控军队，不配兵器、不加训练等。乍看之下，“不配兵器、不加训练”与“严控军队”自相矛盾。实则御兵之道，张弛收放，全在主将掌控。据《张乖崖集·语录》载，张詠在王小波、李顺起义后知益州，不惜牺牲睡眠以整肃军纪，“通夕宴坐”，监听郡楼漏刻报时，一旦有延误，“必诘之”，从此没有执勤军卒敢倦怠应付。《如临大敌》第二章《献上盛世之花》总结北宋在四川地区的统治经验：“解决四川兵变频繁的问题，维护四川社会的稳定，关键在于四川地方官员的人品素质和个人能力。”（135页）这也解释了宋仁宗应对“甲午再乱”谣言最重要的措施：亲择程戡入蜀。事实上，此时这些措施已然见效，四川民众感慨后蜀时代的盛世恍然再现。那么，还需要提防“甲午再乱”谣言吗？&lt;/p&gt;
&lt;p&gt;第三章《皇帝也信谣？》开篇指出：“面对谣言，仁宗是真的怕！”（149页）因为北宋各皇帝在位时期、各地屡有谣言，知名者如开封、洛阳等地的“帽妖”谣言，甚至成为中国历史上的著名疑案。而面对林林总总、形形色色的谣言飞语，皇帝、朝臣、地方官、士人们或严阵以待、或嗤之以鼻、或顾此失彼、或弭患未形……态度有别、措施不一，结果好坏参半。所以，早在皇祐四年（1052）十二月，宋仁宗亲口动问宰相庞籍：“来岁复在甲午，蜀人以为恐。”对于有理论根据（《六十甲子歌》）、有发酵土壤（“西川本自一国”）、有好事之人（蜀人“易动难安”）的“宋代的四川，谣言满天飞是常态”（150页），必须“预为之防”。&lt;/p&gt;

    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-73&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-74&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        按《如临大敌》书中所叙，已退休的司天少监杨惟德对客星出现进行了重新解读：这次客星并不主灾，而是“主国有大贤”，“仁宗随后同意了他的请求，显然也是为了安定人心”（295页）。依照前文逻辑：宋仁宗相信“甲午再乱”谣言→对四川采取预防举措；宋仁宗不相信“甲午再乱”谣言→警惕谣言后果→对四川采取预防措施。若套用到客星出现上：宋仁宗相信客星主凶→对四川采取预防举措；宋仁宗为安定人心宣布客星主吉→警惕杨惟德说法有误→对四川采取预防措施。然而，宋仁宗并没有在客星出现后，继续加强安抚四川的措施，那么就意味着宋仁宗不是为了安定人心，而是真的相信了客星主吉，与“甲午再乱”谣言无关。作为两宋诸帝中，风评仅次于太祖、太宗的明君，宋仁宗如此轻易被杨惟德的说辞左右，是否有失随便？
    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-74&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-75&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        &lt;p&gt;到《如临大敌》的第六章《从来没有真相可言》，引起公元1054年北宋王朝恐慌的谣言的主体，已经从四川地区“甲午再乱”，转移到侬智高可能从大理侵蜀。由表及里，从名到实，彻彻底底地成了人谋。奇怪的是，“仁宗及朝中大臣把侬智高要来攻打四川的谣言当成了一个普通的军事情报，完全没放在心上”（315页）。为什么甲午谣言时效未过，宋仁宗君臣却不再重视侬智高侵蜀谣言呢？&lt;/p&gt;
&lt;p&gt;冷处理即是处理。从结果看，宋仁宗君臣低调处理客星出现和侬智高侵蜀，就是“流言止于智者”，以此切断客星出现、侬智高侵蜀二事与“甲午再乱”谣言之间似有若无的关系。宋仁宗这样思考、行事的底层逻辑，只能是他满意四川地区的既定措施和现状。身为一个成熟的政治家，宋仁宗并没有受惑于星象谶纬、谣言飞语，与笃信道教的宋徽宗截然有别，至和甲午更不会是靖康丙午的前兆。至于在这个过程中，不理解“智者”的高良夫，毕竟是暂时代理，并非宋仁宗钦命。&lt;/p&gt;

    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-75&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-76&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        &lt;p&gt;今时回看北宋“甲午再乱”谣言的产生、扩散和应对，实则是北宋四川地区官与民、官与军、民与军之间，以及朝廷与地方之间繁会丛杂的政治、经济、文化、地域、风俗等观念的冲突与交融。就结果来说，既然甲午第三乱终未发生，便意味着北宋在事实上解决了甲午第一乱和第二乱时期四川地区的种种社会矛盾，将四川地区纳入北宋的既定统治秩序之下，是北宋有效实施地方治理的成功案例。&lt;/p&gt;
&lt;p&gt;《如临大敌》的定位为非虚构历史写作，作者凭借扎实的史学研究功底，自如准确地排布史料，娴熟地运用文学语言，于历史细节处绘事后素，运笔雕龙，完整呈现出公元1054年，因为谣言而导致的四川地区一系列人事、军政、社会变动。正像作者在《结语：历史的听觉》中写道：“通过分析不同时期传闻的内容、传播的方式以及人们对传闻的态度，我们可以窥见当时社会的大众心理、价值观念以及舆论氛围，从而更全面地理解历史。”在史学研究哲学化渐成研究和写作主流范式的今天，尤显不凡。&lt;/p&gt;
&lt;p&gt;《如临大敌》书所关注的北宋谣言，在现代语境里，“主要是指对某个事件或人物道听途说的报道、小道消息或诋毁式的描述，以及对即将到来的某件事情的希望性或灾难性的语言”（155页），可能以短文、词组、顺口溜、段子、谜语等样式通过口头传播，是日常生活中常见的文化现象。问题是谣言在口头传播过程中很容易改编、消失，不辨原始样态。古今皆然。作为普通读者，难免读罢全书仍对“甲午再乱”谣言有些许疑问：这则谣言的制造者仅仅抓取公元934年、994年两个甲午，作为案例样本数量太少，何以自信能够煽动四川地区民心，发生第三乱？&lt;/p&gt;
&lt;p&gt;“甲午再乱”这种与纪年星象相关的谣言，其产生和传播的上游，必然以有神论信仰为前提，或为佛、道，或为民间神祇。从时间上看，孟知祥、王小波、李顺这些当事人，理应知道《六十甲子歌》及其衍生品，那么他们是否知晓类似“甲午再乱”的谣言？可惜史料缺失，无从查证。以王小波、李顺起义为例，《如》书中分析了北宋统一后，外地富商携资涌入四川贩茶，导致王小波、李顺等当地茶农破产，因而提出“吾疾贫富不均，今为汝均之”的著名起义口号。然而，茶叶种植与纪年星象并无直接关系。&lt;/p&gt;
&lt;p&gt;据《宋朝事实类苑》卷二十三《官政治绩》引《本朝名臣传》（佚）载，宋仁宗天圣六年（1028）程琳知益州，当时有妖人自称李冰神子，聚百余人，拜灌口二郎神，私设官号。程琳获知此事后，“皆捕而戮之”，虽然他有便宜行事权，但是一次屠戮上百人，亦需向朝廷解释，程琳的说法是：“李顺由此而起，今锄其根本，且使蜀中数十年无恙。”这段话中的“由此而起”四字，揭示了王小波、李顺起义一个未被关注到的细节：他们早期在青城县时，也是通过祭神等民间宗教信仰活动，发动组织队伍。&lt;/p&gt;
&lt;p&gt;《六十甲子歌》和“甲午再乱”谣言之间，存在着显而易见的关联。早在1985年出版的周宝珠、陈振《简明宋史》一书中，更是将二者视同一律（47页）。既如此，何妨大胆推测：“甲午”谣言的原始样态，是否有可能是王小波、李顺或其部属基于《六十甲子歌》改造的论证起义合理性的谶语？起义失败后继续在蜀地流传，被好事者传为“甲午再乱”谣言？姑备一说，俟达者正之。&lt;/p&gt;

    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-76&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;
&lt;h3 id=&#34;ancient-rock-art-rewrites-the-arabian-deserts-history-古代岩画改写阿拉伯沙漠的历史&#34;&gt;Ancient Rock Art Rewrites the Arabian Desert’s History 古代岩画改写阿拉伯沙漠的历史
&lt;/h3&gt;&lt;div class=&#34;note-card&#34;&gt;
    &lt;div class=&#34;nc-accent&#34;&gt;&lt;/div&gt;

    &lt;div class=&#34;nc-header&#34;&gt;
        &lt;div class=&#34;nc-meta&#34;&gt;
            &lt;span class=&#34;nc-badge&#34;&gt;READING&lt;/span&gt;
            &lt;span class=&#34;nc-date&#34;&gt;2025-10-19&lt;/span&gt;
        &lt;/div&gt; &lt;a href=&#34;https://hyperallergic.com/1047937/ancient-rock-art-rewrites-the-arabian-deserts-history/&#34; target=&#34;_blank&#34; class=&#34;nc-title&#34; title=&#34;访问原文&#34;&gt;
            Ancient Rock Art Rewrites the Arabian Desert’s History 古代岩画改写阿拉伯沙漠的历史
            &lt;svg class=&#34;nc-link-icon&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
        &lt;/a&gt;
    &lt;/div&gt;

    
    &lt;div class=&#34;nc-context&#34;&gt;
        &lt;div class=&#34;nc-quote-icon&#34;&gt;“&lt;/div&gt;
        &lt;div class=&#34;nc-summary-text&#34;&gt;阿拉伯沙漠中真人大小的动物岩刻表明该地区在 12，000 年前就有人居住，这挑战了先前的认知。这些岩刻位于沙特阿拉伯的内夫德沙漠，描绘了沙漠动物，很可能被游牧的狩猎采集者用来记录淡水来源。在遗址发现的文物也表明了与黎凡特人群的联系。这些发现填补了该地区考古时间线的空白，表明尽管环境干旱，但人口依然兴旺。&lt;/div&gt;
    &lt;/div&gt;
    

    
    
    
&lt;/div&gt;

&lt;style&gt;
     
    .note-card {
         
        --nc-bg-card: #ffffff;
        --nc-border: rgba(0,0,0,0.04);
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.08);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.12);
        
        --nc-title: #2c3e50;
        --nc-title-hover: #3a7bd5;
        --nc-meta: #999999;
        
        --nc-bg-context: #f8f9fa;
        --nc-border-context: #e2e8f0;
        --nc-quote-icon: #e2e8f0;
        --nc-text-summary: #555555;
        
        --nc-label-bg: #ffffff;
        --nc-label-text: #2d3748;
        --nc-content-text: #2d3748;
        --nc-link-icon: #cbd5e0;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.1);
        --nc-badge-text: #3a7bd5;

        position: relative;
        background: var(--nc-bg-card);
        border-radius: 12px;
        box-shadow: var(--nc-shadow);
        margin: 2.5rem 0;
        overflow: hidden;
        border: 1px solid var(--nc-border);
        font-family: inherit; 
        transition: transform 0.3s ease, box-shadow 0.3s ease, background 0.3s, border-color 0.3s;
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .note-card {
            --nc-bg-card: #1e1e1e;
            --nc-border: #333333;
            --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
            --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
            
            --nc-title: #f0f0f0;
            --nc-meta: #999999;
            
            --nc-bg-context: #252525;
            --nc-border-context: #444444;
            --nc-quote-icon: #333333;
            --nc-text-summary: #aaaaaa;
            
            --nc-label-bg: #1e1e1e;
            --nc-label-text: #cccccc;
            --nc-content-text: #dddddd;
            --nc-link-icon: #666666;
            
            --nc-badge-bg: rgba(58, 123, 213, 0.2);
        }
    }

    html[data-scheme=&#34;dark&#34;] .note-card {
        --nc-bg-card: #1e1e1e;
        --nc-border: #333333;
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
        
        --nc-title: #f0f0f0;
        --nc-meta: #999999;
        
        --nc-bg-context: #252525;
        --nc-border-context: #444444;
        --nc-quote-icon: #333333;
        --nc-text-summary: #aaaaaa;
        
        --nc-label-bg: #1e1e1e;
        --nc-label-text: #cccccc;
        --nc-content-text: #dddddd;
        --nc-link-icon: #666666;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.2);
    }

    .note-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--nc-shadow-hover);
    }

     
    .nc-accent {
        height: 4px;
        background: linear-gradient(90deg, #3a7bd5, #00d2ff); 
        width: 100%;
    }

     
    .nc-header {
        padding: 24px 28px 10px; 
    }

    .nc-meta {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 10px; 
        font-size: 13px; 
        color: var(--nc-meta);
        font-weight: 600;
        letter-spacing: 1px;
        text-transform: uppercase;
    }

    .nc-badge {
        color: var(--nc-badge-text);
        background: var(--nc-badge-bg);
        padding: 2px 6px;
        border-radius: 4px;
    }

    .nc-title {
        display: block;
        font-size: 2rem; 
        font-weight: 700;
        color: var(--nc-title);
        text-decoration: none;
        line-height: 1.3;
        transition: color 0.2s;
    }

    .nc-title:hover {
        color: var(--nc-title-hover);
    }

    .nc-link-icon {
        width: 20px; 
        height: 20px;
        color: var(--nc-link-icon);
        margin-left: 5px;
        vertical-align: middle;
        transition: color 0.2s;
    }

    .nc-title:hover .nc-link-icon {
        color: var(--nc-title-hover);
    }

     
    .nc-context {
        margin: 12px 28px 24px;
        background: var(--nc-bg-context);
        padding: 20px 24px;
        border-radius: 8px;
        position: relative;
        border-left: 4px solid var(--nc-border-context);
        transition: background 0.3s, border-color 0.3s;
    }

    .nc-quote-icon {
        position: absolute;
        top: 8px;
        left: 10px;
        font-family: serif; 
        font-size: 40px;
        line-height: 1;
        color: var(--nc-quote-icon);
        pointer-events: none;
        transition: color 0.3s;
    }

    .nc-summary-text {
        font-size: 1.7rem; 
        color: var(--nc-text-summary);
        line-height: 1.6;
        font-style: italic;
        position: relative;
        z-index: 1;
        padding-left: 15px; 
        transition: color 0.3s;
    }

     
    .nc-body {
        padding: 0 28px 32px;
        position: relative;
    }

     
    .nc-label {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        font-size: 13px; 
        font-weight: 700;
        color: var(--nc-label-text);
        background: var(--nc-label-bg);
        padding-right: 10px;
        margin-bottom: 12px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
        transition: color 0.3s, background 0.3s;
    }

    .nc-content {
        color: var(--nc-content-text);
        font-size: 1.6rem; 
        line-height: 1.75;
        transition: color 0.3s;
    }

     
    .nc-content p { margin-bottom: 1em; }
    .nc-content p:last-child { margin-bottom: 0; }
    
    .nc-content ul { padding-left: 20px; color: inherit; }
    .nc-content li { margin-bottom: 6px; }
&lt;/style&gt;
&lt;h3 id=&#34;曾经高薪光鲜的明星职业赚不到钱了&#34;&gt;曾经高薪光鲜的“明星”职业，赚不到钱了？
&lt;/h3&gt;&lt;div class=&#34;note-card&#34;&gt;
    &lt;div class=&#34;nc-accent&#34;&gt;&lt;/div&gt;

    &lt;div class=&#34;nc-header&#34;&gt;
        &lt;div class=&#34;nc-meta&#34;&gt;
            &lt;span class=&#34;nc-badge&#34;&gt;READING&lt;/span&gt;
            &lt;span class=&#34;nc-date&#34;&gt;2025-10-19&lt;/span&gt;
        &lt;/div&gt; &lt;a href=&#34;http://weixin.sogou.com/weixin?type=2&amp;amp;query=%E4%B8%89%E8%81%94%E7%94%9F%E6%B4%BB%E5%91%A8%E5%88%8A&amp;#43;%E6%9B%BE%E7%BB%8F%E9%AB%98%E8%96%AA%E5%85%89%E9%B2%9C%E7%9A%84%E2%80%9C%E6%98%8E%E6%98%9F%E2%80%9D%E8%81%8C%E4%B8%9A%EF%BC%8C%E8%B5%9A%E4%B8%8D%E5%88%B0%E9%92%B1%E4%BA%86%EF%BC%9F&#34; target=&#34;_blank&#34; class=&#34;nc-title&#34; title=&#34;访问原文&#34;&gt;
            曾经高薪光鲜的“明星”职业，赚不到钱了？
            &lt;svg class=&#34;nc-link-icon&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
        &lt;/a&gt;
    &lt;/div&gt;

    
    &lt;div class=&#34;nc-context&#34;&gt;
        &lt;div class=&#34;nc-quote-icon&#34;&gt;“&lt;/div&gt;
        &lt;div class=&#34;nc-summary-text&#34;&gt;编剧这个曾经被认为是光鲜亮丽的职业，如今却面临着岌岌可危的境况。年轻、不知名的编剧往往经历收入不稳定、剧本修改以及署名权得不到保障的风险。他们面临着工作界限不明确、被资深编剧剥削以及难以维护自身权益等挑战。改编现有 IP 的趋势以及短视频内容的兴起进一步复杂化了他们的处境，使得原创剧本更难获得认可，编剧也更难获得公平的报酬和肯定。&lt;/div&gt;
    &lt;/div&gt;
    

    
    
    
&lt;/div&gt;

&lt;style&gt;
     
    .note-card {
         
        --nc-bg-card: #ffffff;
        --nc-border: rgba(0,0,0,0.04);
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.08);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.12);
        
        --nc-title: #2c3e50;
        --nc-title-hover: #3a7bd5;
        --nc-meta: #999999;
        
        --nc-bg-context: #f8f9fa;
        --nc-border-context: #e2e8f0;
        --nc-quote-icon: #e2e8f0;
        --nc-text-summary: #555555;
        
        --nc-label-bg: #ffffff;
        --nc-label-text: #2d3748;
        --nc-content-text: #2d3748;
        --nc-link-icon: #cbd5e0;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.1);
        --nc-badge-text: #3a7bd5;

        position: relative;
        background: var(--nc-bg-card);
        border-radius: 12px;
        box-shadow: var(--nc-shadow);
        margin: 2.5rem 0;
        overflow: hidden;
        border: 1px solid var(--nc-border);
        font-family: inherit; 
        transition: transform 0.3s ease, box-shadow 0.3s ease, background 0.3s, border-color 0.3s;
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .note-card {
            --nc-bg-card: #1e1e1e;
            --nc-border: #333333;
            --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
            --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
            
            --nc-title: #f0f0f0;
            --nc-meta: #999999;
            
            --nc-bg-context: #252525;
            --nc-border-context: #444444;
            --nc-quote-icon: #333333;
            --nc-text-summary: #aaaaaa;
            
            --nc-label-bg: #1e1e1e;
            --nc-label-text: #cccccc;
            --nc-content-text: #dddddd;
            --nc-link-icon: #666666;
            
            --nc-badge-bg: rgba(58, 123, 213, 0.2);
        }
    }

    html[data-scheme=&#34;dark&#34;] .note-card {
        --nc-bg-card: #1e1e1e;
        --nc-border: #333333;
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
        
        --nc-title: #f0f0f0;
        --nc-meta: #999999;
        
        --nc-bg-context: #252525;
        --nc-border-context: #444444;
        --nc-quote-icon: #333333;
        --nc-text-summary: #aaaaaa;
        
        --nc-label-bg: #1e1e1e;
        --nc-label-text: #cccccc;
        --nc-content-text: #dddddd;
        --nc-link-icon: #666666;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.2);
    }

    .note-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--nc-shadow-hover);
    }

     
    .nc-accent {
        height: 4px;
        background: linear-gradient(90deg, #3a7bd5, #00d2ff); 
        width: 100%;
    }

     
    .nc-header {
        padding: 24px 28px 10px; 
    }

    .nc-meta {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 10px; 
        font-size: 13px; 
        color: var(--nc-meta);
        font-weight: 600;
        letter-spacing: 1px;
        text-transform: uppercase;
    }

    .nc-badge {
        color: var(--nc-badge-text);
        background: var(--nc-badge-bg);
        padding: 2px 6px;
        border-radius: 4px;
    }

    .nc-title {
        display: block;
        font-size: 2rem; 
        font-weight: 700;
        color: var(--nc-title);
        text-decoration: none;
        line-height: 1.3;
        transition: color 0.2s;
    }

    .nc-title:hover {
        color: var(--nc-title-hover);
    }

    .nc-link-icon {
        width: 20px; 
        height: 20px;
        color: var(--nc-link-icon);
        margin-left: 5px;
        vertical-align: middle;
        transition: color 0.2s;
    }

    .nc-title:hover .nc-link-icon {
        color: var(--nc-title-hover);
    }

     
    .nc-context {
        margin: 12px 28px 24px;
        background: var(--nc-bg-context);
        padding: 20px 24px;
        border-radius: 8px;
        position: relative;
        border-left: 4px solid var(--nc-border-context);
        transition: background 0.3s, border-color 0.3s;
    }

    .nc-quote-icon {
        position: absolute;
        top: 8px;
        left: 10px;
        font-family: serif; 
        font-size: 40px;
        line-height: 1;
        color: var(--nc-quote-icon);
        pointer-events: none;
        transition: color 0.3s;
    }

    .nc-summary-text {
        font-size: 1.7rem; 
        color: var(--nc-text-summary);
        line-height: 1.6;
        font-style: italic;
        position: relative;
        z-index: 1;
        padding-left: 15px; 
        transition: color 0.3s;
    }

     
    .nc-body {
        padding: 0 28px 32px;
        position: relative;
    }

     
    .nc-label {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        font-size: 13px; 
        font-weight: 700;
        color: var(--nc-label-text);
        background: var(--nc-label-bg);
        padding-right: 10px;
        margin-bottom: 12px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
        transition: color 0.3s, background 0.3s;
    }

    .nc-content {
        color: var(--nc-content-text);
        font-size: 1.6rem; 
        line-height: 1.75;
        transition: color 0.3s;
    }

     
    .nc-content p { margin-bottom: 1em; }
    .nc-content p:last-child { margin-bottom: 0; }
    
    .nc-content ul { padding-left: 20px; color: inherit; }
    .nc-content li { margin-bottom: 6px; }
&lt;/style&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-79&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        &lt;p&gt;贺雪毕业于戏剧影视文学专业，2020年毕业前，她就听已经工作的师兄师姐提到，相对于校园里对个人表达的强调，工作后，编剧往往是集体创作的模式，尤其是刚入行的年轻编剧往往要先在成熟的大编剧手下做助理，接受分配的任务，一个小编剧幸运的话也得经过十年才能相对独立地工作。但真正开始工作后，她才对这个行业有了更为切实的体会。&lt;/p&gt;
&lt;p&gt;贺雪告诉本刊，刚入行的两年里，她很接纳集体创作的模式，觉得整个编剧团队的想法可以随时同步、互相激发灵感，所以她不挑剧组大小，看到感兴趣且时间合适的项目就会去试稿。她去过知名影视公司投资的大制作，也去过一些成本低、故事以通俗狗血的现代偶像剧为主的小投资制作，都是在大编剧手下工作。但慢慢地她发现，年轻编剧的权益其实很难得到保障——年轻编剧能否获得署名、获得多少薪酬，“要看大编剧的良心”。贺雪拿过大编剧稿酬的六、七分之一，也见过朋友只拿到十几分之一。&lt;/p&gt;
&lt;p&gt;更让她无法忍受的是工作与生活的杂糅：她在做编剧助理时，同时是大编剧的生活助理、工作助理。她提到2022年曾进入到一个完全封闭的电视剧集体创作项目中：大编剧带着她和另外一个年轻编剧住在一个两室一厅的公寓里，集体创作了一年。贺雪说，当时作息要完全配合大编剧来，大编剧爱熬夜，有时候晚上拉着她们讨论剧本或是喝酒聊天，多晚都得陪着。原本在屋里睡觉，听见屋外有大编剧的响动，她和同事都“心惊胆战，然后迅速起床”。她们还要给大编剧做饭、洗碗、洗衣服、晾衣服。&lt;/p&gt;
&lt;p&gt;此外，每当她战战兢兢地把自己写的剧本交给大编剧，经常得到直白的攻击，“现在去大马路上拉个人过来都能写得比你好。”有时候大编剧也没有具体的想法，只是下一个简单的指令让她们去碰撞灵感、生发剧情，收到稿件后总是不满意。贺雪觉得，当时的状态就像是“孤岛求生”。 她觉得自己陷入情绪的漩涡中，每天想的都是自己是不是又做错事了，是不是吃饭时间太长没有写稿。剧本写到一半的进度，她觉得难以支撑，离开了项目。也因此，她没有得到署名，稿费也就是最开始收到的定金3万元。&lt;/p&gt;

    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-79&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-80&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        &lt;p&gt;韩熙月从业10年，参与过不少讨论成年男女情感博弈类型的电视剧。刚入行时她也做过大编剧的助理，现在主要以独立编剧的身份接项目。她觉得，年轻的编剧刚入行时，很多时候被刻意模糊了工作边界和概念。2018年，她曾进入一个大编剧的工作室工作，对方跟她签的合同是“策划”。但她既要参与前期剧本策划，又要撰写剧本。她问过大编剧自己做的工作算不算编剧，是不是可以获得署名，编剧说如果内容得到甲方认可，就可以获得署名。&lt;/p&gt;
&lt;p&gt;韩熙月告诉本刊，自己在那个工作室工作了三四年，参与的剧本有的是在沟通思路时就没有跟甲方一致，有的虽然进入撰写剧本阶段，但一直没有定稿，所以没有一个项目真正开机，她也就没有获得过署名。 她逐渐意识到，大编剧并不会像一个“老师”那样指导、提携后辈，更多的是把手下的年轻编剧当成廉价劳动力。&lt;/p&gt;

    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-80&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-81&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        除了署名，让高群感觉到更有落差的是编剧的话语权很弱。编剧高群2015年入行，从小品、段子写起，也写了几部网络大电影。他告诉本刊，在剧本开发阶段，他曾收到来自制片、公司老总等各方的意见，这些意见很不统一。作为编剧的他改了好几个版本，有时候在开会时，几个甲方突然针对剧本的一个细节热烈讨论起来，转头要他记下来，做出修改，态度很随意。甚至有的是投资方已经通过了剧本，导演却说剧本不成立。还有一次，他做跟组编剧，在片场，一个演员即兴表演了一段夸张的动作，并要求高群把剧本改成即兴表演的那段。起初高群还会和演员争论，说“喜剧是有包袱的”，自己演得开心，不代表在观众那里包袱能响。但更多时候，他只能妥协。
    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-81&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-82&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        &lt;p&gt;贺雪说，在行业里，编剧与剧组发生纠纷的事情并不少见，她在读研期间就听师兄师姐说起维权的事，后来她自己也遇到过。那是2024年冬天，贺雪参与的项目甲方突然要求解约，他们找了一个更有名气和人脉资源的大编剧替代贺雪的团队，还要她把之前收到的稿酬退回去。&lt;/p&gt;
&lt;p&gt;贺雪觉得不公平，她找了律师咨询。律师告诉她签订的合同有些“霸王条款”。比如提到乙方交付的内容必须让甲方满意，甲方才会支付报酬。“甲方哪怕不喜欢你的文档格式，也可以说不满意。”贺雪细细地梳理合同，注意到甲方还写了如果乙方在规定期限之后还是无法让甲方满意的话，需要退还甲方前期的稿酬。好在解约前，她一直按时交付稿件，甲方也没有让她修改，这证明她之前的工作是让甲方满意的。她不想在官司上陷太久，就带着这些有利证据和甲方谈判，最后保住了自己的稿费。&lt;/p&gt;

    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-82&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-83&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        &lt;p&gt;但并不是所有人都有这个运气。浙江卿驰律师事务所主任沈洁在2014年入行，从业最初的几年主要是为影视行业的制片及宣发公司提供法律顾问服务，她告诉本刊，从谈判地位来说，甲方通常处于强势地位，对合同的审阅需求是“一切从严”，通过合同条款用最强的力度保护自身权利，比如会要求编剧修改稿件到甲方满意为止，强调并设置甲方任意解除权，拥有决定署名和版权归属的权力。她说除非合同内存在其他冲突条款可以援引，否则这些条款很不利于编剧维权。工作这些年，陆续也有编剧向她咨询法律问题，她也代理了一些相应的官司。沈洁说，找她咨询的编剧往往在面对的问题，一个是收不到尾款，一个是署名权得不到保障，或是稿子被改得面目全非，但还是被署了名字，进而导致播出后编剧“背锅”名誉受损。&lt;/p&gt;
&lt;p&gt;沈洁曾遇到一位编剧在把全剧本交给甲方后发现甲方在之前的另一项目合作中对她不诚信，就想提前结束这次合作，但合同规定编剧提交全本后只能收到5万元，之后要配合修改，直到符合项目开机等条件才能收到后续款项。沈洁告诉这位编剧，合同约定得太死，甚至抓不出一个条款有上法庭辩论的空间，打官司胜诉的几率很低。一般这样的情况沈洁往往会劝编剧“算了”。她估算，这些年来找她咨询的编剧中，真正能够走上法庭最终通过诉讼方式解决争议的可能连 5% 都不到。&lt;/p&gt;
&lt;p&gt;杨涵是少数走到胜诉的编剧。杨涵和搭档王雨铭是在2018年11月进入《隐秘的角落》编剧组工作的。杨涵告诉本刊，编剧组里还有一个编剧，三人分工，一人写四集。 工作了2个多月后，杨涵和搭档写完了前三集的剧本。这之后没多久，制片人以大编剧的加入、不再需要他们工作的理由对二人进行了解约。执行制片人承诺将会把前三集的稿酬打给他们，但她四年多来一直没有收到。&lt;/p&gt;
&lt;p&gt;2020年6月《隐秘的角落》在互联网开播，杨涵发现前三集很多情节都是自己创作的。而她和搭档却没有获得署名和报酬。她给制片人打电话问询，对方说杨涵和搭档的贡献没有达到可以署名编剧的程度，因此在片尾特别鸣谢栏写上两人。2020年8月，杨涵对制作公司提起了诉讼。&lt;/p&gt;
&lt;p&gt;官司经历了数次管辖权争议、庭前会议、调解、一审和二审，前后经过了4年，杨涵觉得自己一直处在一种悬而未决的焦虑中。2024年10月14日，她终于收到二审的判决，法院认定涉案网剧前三集存在大量使用王雨铭、杨涵剧本独创性表达，王雨铭、杨涵应当作为编剧署名。&lt;/p&gt;

    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-83&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-84&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        此外，编剧维权官司不好打的原因还可能包括存举证困难。沈洁说，例如一些编剧在开剧本探讨会时没有想到要录音或及时形成书面会议纪要并经过与会各方确认，有的共创讨论会也比较临时，在法庭上就难以还原关于创意归属或创作要求、增减创作集数等重要涉案细节。同时，在沈洁看来，维权也是一件费时费力且成本也比较大的事情。尤其有些案件中，甲方倾向于通过商事仲裁方式解决争议，如果合同最终约定的是通过商事仲裁方式解决争议，商事仲裁收费标准通常是法院诉讼费计费标准的三倍左右，且商事仲裁一裁终局无法二审，不公开审理，因此一定程度上也会影响编剧决定最终是否采取司法途径维护自身权利。
    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-84&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-85&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        余飞记得，在网络平台成熟之前，全国有6000多家电视台，开发、购买的大大小小的项目很多，新编剧的就业途径也很多。他们可以先从影视公司做责编再慢慢转去做编剧、自创小说获得改编机会、跟着大编剧共同开发项目、进组给导演做跟组编剧等等。原创剧本当时也占据较大比例，对自己作品有信心的成熟编剧会先写完剧本再拿到制作公司或电视台去卖。
    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-85&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-86&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        &lt;p&gt;浙江美视众乐影视有限公司的董事长叶统告诉本刊，在“电视台”时代，电视剧的题材、创作方式都很多样。他们公司的创始人原本是实业家，2014年，创始人在义乌和一些商人聊起在义乌的创业史，萌生了做一部电视剧展现义乌商人创业情怀的故事，于是开影视公司、拉投资、找了行业里资深的编剧合作，多次去义乌走访，制作了电视剧《鸡毛飞上天》。&lt;/p&gt;
&lt;p&gt;但那时，他也关注到电视剧行业已经开始产生变动。随着爱奇艺、优酷、腾讯等网络平台的爆火，资本从电视台向网络平台流动。而平台制作剧集的思路和电视台完全不同，平台以改编有受众基础的网络小说IP为主，创作方式更加以市场为导向，“标签化、数据化”，编剧的工作也变得以循规蹈矩地改编为主。&lt;/p&gt;
&lt;p&gt;叶统说，电视剧制作公司其实比编剧更早地感受到行业的紧缩，开始降本增效。叶统告诉本刊，影视行业的市场变化非常快，这些年一些跟不上变化的出品公司资金链断裂，都倒闭了。在《鸡毛飞上天》播出后，他的公司还在坚持做同类型的正剧，但也意识到这类剧很难赚钱，于是在2015年开始做网络大电影，2022年开始做横屏中剧。原本他的公司合作的都是资深大编剧，2019年感受到市场行情变差，他们开始与稿酬低一档的，不太知名但有过一些成熟作品的自由编剧合作。&lt;/p&gt;

    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-86&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-87&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        &lt;p&gt;最近几年，余飞也发现平台在面对越来越严峻的盈利压力时，也在缩减不必要的开发项目，采取“掐尖”策略，选择最强的班底，开发最好的项目。罗凡是一家网络平台的制片人。他告诉本刊，平台会对正在开发的项目定级，最好的剧本、班底的剧被定为S+，依次往下排，还有A级、B级剧。剧本过关了，就进入制作立项流程。罗凡告诉本刊，以前一些A级、B级剧，剧本和演员班底相对一般，没有创新度，比如一些循规蹈矩的言情剧，在可过与不可之间，现在都通不过了。&lt;/p&gt;
&lt;p&gt;叶统注意到，从电视剧到网络大电影，再到短剧，流行形式的变化也要求编剧不断地调整创作方式。比如他的公司里有编剧之前写的是“男频”的西游题材、历史人物题材，网大流行后，开始写网大，讲究的前几分钟就有紧凑的故事情节。最近三年公司转型写短剧，市场面向女性更多，这位编剧又开始写民国甜宠、都市婆媳。但短剧吸引人的是搭建“人设”，他并不擅长，最后的成片反响平平。&lt;/p&gt;
&lt;p&gt;罗凡在和编剧对接的过程中也发现，很多年轻编剧习惯了多年来改编IP的工作模式，但最近平台和观众更希望看到基于对生活的观察、对普通人关怀的，有意思、有洞察的作品，编剧却很难写出。“他们的生活本身被工作所困，很难有机会去看到其他工种、阶层的人的生存状态。”&lt;/p&gt;

    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-87&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;
&lt;h3 id=&#34;法国第一夫人证明自己不是男性怎么这么难&#34;&gt;法国第一夫人，“证明自己不是男性”怎么这么难？
&lt;/h3&gt;&lt;div class=&#34;note-card&#34;&gt;
    &lt;div class=&#34;nc-accent&#34;&gt;&lt;/div&gt;

    &lt;div class=&#34;nc-header&#34;&gt;
        &lt;div class=&#34;nc-meta&#34;&gt;
            &lt;span class=&#34;nc-badge&#34;&gt;READING&lt;/span&gt;
            &lt;span class=&#34;nc-date&#34;&gt;2025-10-19&lt;/span&gt;
        &lt;/div&gt; &lt;a href=&#34;http://weixin.sogou.com/weixin?type=2&amp;amp;query=%E4%B8%89%E8%81%94%E7%94%9F%E6%B4%BB%E5%91%A8%E5%88%8A&amp;#43;%E6%B3%95%E5%9B%BD%E7%AC%AC%E4%B8%80%E5%A4%AB%E4%BA%BA%EF%BC%8C%E2%80%9C%E8%AF%81%E6%98%8E%E8%87%AA%E5%B7%B1%E4%B8%8D%E6%98%AF%E7%94%B7%E6%80%A7%E2%80%9D%E6%80%8E%E4%B9%88%E8%BF%99%E4%B9%88%E9%9A%BE%EF%BC%9F&#34; target=&#34;_blank&#34; class=&#34;nc-title&#34; title=&#34;访问原文&#34;&gt;
            法国第一夫人，“证明自己不是男性”怎么这么难？
            &lt;svg class=&#34;nc-link-icon&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
        &lt;/a&gt;
    &lt;/div&gt;

    
    &lt;div class=&#34;nc-context&#34;&gt;
        &lt;div class=&#34;nc-quote-icon&#34;&gt;“&lt;/div&gt;
        &lt;div class=&#34;nc-summary-text&#34;&gt;“布丽吉特·马克龙生来是一名男性。”在一位美国右翼网红的推动下，这一话题仅在法语国家的浏览量就超过了十亿次。马克龙夫妇或许也没有想到，自己要向远在大西洋彼岸的美国法庭证明自己的性别。&lt;/div&gt;
    &lt;/div&gt;
    

    
    
    
&lt;/div&gt;

&lt;style&gt;
     
    .note-card {
         
        --nc-bg-card: #ffffff;
        --nc-border: rgba(0,0,0,0.04);
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.08);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.12);
        
        --nc-title: #2c3e50;
        --nc-title-hover: #3a7bd5;
        --nc-meta: #999999;
        
        --nc-bg-context: #f8f9fa;
        --nc-border-context: #e2e8f0;
        --nc-quote-icon: #e2e8f0;
        --nc-text-summary: #555555;
        
        --nc-label-bg: #ffffff;
        --nc-label-text: #2d3748;
        --nc-content-text: #2d3748;
        --nc-link-icon: #cbd5e0;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.1);
        --nc-badge-text: #3a7bd5;

        position: relative;
        background: var(--nc-bg-card);
        border-radius: 12px;
        box-shadow: var(--nc-shadow);
        margin: 2.5rem 0;
        overflow: hidden;
        border: 1px solid var(--nc-border);
        font-family: inherit; 
        transition: transform 0.3s ease, box-shadow 0.3s ease, background 0.3s, border-color 0.3s;
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .note-card {
            --nc-bg-card: #1e1e1e;
            --nc-border: #333333;
            --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
            --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
            
            --nc-title: #f0f0f0;
            --nc-meta: #999999;
            
            --nc-bg-context: #252525;
            --nc-border-context: #444444;
            --nc-quote-icon: #333333;
            --nc-text-summary: #aaaaaa;
            
            --nc-label-bg: #1e1e1e;
            --nc-label-text: #cccccc;
            --nc-content-text: #dddddd;
            --nc-link-icon: #666666;
            
            --nc-badge-bg: rgba(58, 123, 213, 0.2);
        }
    }

    html[data-scheme=&#34;dark&#34;] .note-card {
        --nc-bg-card: #1e1e1e;
        --nc-border: #333333;
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
        
        --nc-title: #f0f0f0;
        --nc-meta: #999999;
        
        --nc-bg-context: #252525;
        --nc-border-context: #444444;
        --nc-quote-icon: #333333;
        --nc-text-summary: #aaaaaa;
        
        --nc-label-bg: #1e1e1e;
        --nc-label-text: #cccccc;
        --nc-content-text: #dddddd;
        --nc-link-icon: #666666;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.2);
    }

    .note-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--nc-shadow-hover);
    }

     
    .nc-accent {
        height: 4px;
        background: linear-gradient(90deg, #3a7bd5, #00d2ff); 
        width: 100%;
    }

     
    .nc-header {
        padding: 24px 28px 10px; 
    }

    .nc-meta {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 10px; 
        font-size: 13px; 
        color: var(--nc-meta);
        font-weight: 600;
        letter-spacing: 1px;
        text-transform: uppercase;
    }

    .nc-badge {
        color: var(--nc-badge-text);
        background: var(--nc-badge-bg);
        padding: 2px 6px;
        border-radius: 4px;
    }

    .nc-title {
        display: block;
        font-size: 2rem; 
        font-weight: 700;
        color: var(--nc-title);
        text-decoration: none;
        line-height: 1.3;
        transition: color 0.2s;
    }

    .nc-title:hover {
        color: var(--nc-title-hover);
    }

    .nc-link-icon {
        width: 20px; 
        height: 20px;
        color: var(--nc-link-icon);
        margin-left: 5px;
        vertical-align: middle;
        transition: color 0.2s;
    }

    .nc-title:hover .nc-link-icon {
        color: var(--nc-title-hover);
    }

     
    .nc-context {
        margin: 12px 28px 24px;
        background: var(--nc-bg-context);
        padding: 20px 24px;
        border-radius: 8px;
        position: relative;
        border-left: 4px solid var(--nc-border-context);
        transition: background 0.3s, border-color 0.3s;
    }

    .nc-quote-icon {
        position: absolute;
        top: 8px;
        left: 10px;
        font-family: serif; 
        font-size: 40px;
        line-height: 1;
        color: var(--nc-quote-icon);
        pointer-events: none;
        transition: color 0.3s;
    }

    .nc-summary-text {
        font-size: 1.7rem; 
        color: var(--nc-text-summary);
        line-height: 1.6;
        font-style: italic;
        position: relative;
        z-index: 1;
        padding-left: 15px; 
        transition: color 0.3s;
    }

     
    .nc-body {
        padding: 0 28px 32px;
        position: relative;
    }

     
    .nc-label {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        font-size: 13px; 
        font-weight: 700;
        color: var(--nc-label-text);
        background: var(--nc-label-bg);
        padding-right: 10px;
        margin-bottom: 12px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
        transition: color 0.3s, background 0.3s;
    }

    .nc-content {
        color: var(--nc-content-text);
        font-size: 1.6rem; 
        line-height: 1.75;
        transition: color 0.3s;
    }

     
    .nc-content p { margin-bottom: 1em; }
    .nc-content p:last-child { margin-bottom: 0; }
    
    .nc-content ul { padding-left: 20px; color: inherit; }
    .nc-content li { margin-bottom: 6px; }
&lt;/style&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-89&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        自从成为法国历史上最年轻的总统，埃马纽埃尔·马克龙和比他大24岁的妻子布丽吉特·马克龙（Brigitte Macron）的故事一直为人们津津乐道，围绕他们之间的八卦和谣言也总是能够吸人眼球的话题。今年7月，布里吉特和马克龙不惜跨国对一位美国黑人右翼网红坎迪斯·欧文斯（Candace Owens）提起诽谤诉讼，并在上个月计划向美国法院提交照片和科学证据——只为证明法国第一夫人布丽吉特，是一名女性。
    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-89&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-90&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        &lt;p&gt;“布丽吉特其实是男性”听起来匪夷所思，但其实并不是欧文斯的原创。这一说法最早在法国流传是在2021年12月，一位自称是“灵媒”的女子阿曼丁·罗伊（Amandine Roy）在自己的油管频道上发布了一段长达四小时的视频。她在视频中采访了娜塔莎·雷（Natacha Rey），雷称自己是一名“自学成才的独立调查记者” 。&lt;/p&gt;
&lt;p&gt;雷在采访中表示，因为她对布丽吉特在照片中的体型产生怀疑，她花了三年的时间调查了这位第一夫人。她认为布丽吉特的家庭照片中的小女孩不是布丽吉特本人，照片另一边被认为是布丽吉特哥哥的让-米歇尔·特罗涅（Jean-Michel Trogneux）才是她。而布里吉特在成长过程中留下的影像照片较少，留下了解释的空白。通过分析各种与布丽吉特家族相关的照片，雷认为自己揭穿了一场“国家的骗局”，布丽吉特是接受了性别重置手术后与马克龙结婚。&lt;/p&gt;

    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-90&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-91&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        &lt;p&gt;罗伊和雷的采访视频播放在几小时内达到了45万，#JeanMichelTrogneux 的话题标签登上了法国社交媒体热搜，并在2022年马克龙第二次竞选总统前大量传播。根据《解放报》（Libération）报道，当时发布相关内容的账号大多来自反对马克龙的群体。2022年初，布丽吉特与她的哥哥让-米歇尔·特罗涅在法国对罗伊和雷提起诽谤诉讼。&lt;/p&gt;
&lt;p&gt;2024年9月，巴黎初审法院判定两人有罪。然而，今年7月巴黎上诉法院又推翻了这一判决，认为这些关于性别指控是“出于善意”（bonne foi）提出的。在法国民法典中，“善意诚实”是一条重要的原则，善意必须满足的四个条件是，措辞谨慎；没有个人敌意；目的合法；合理调查（即便最终说法可能错）。在对于公众人物的诽谤案件中，要证明被告出于实际恶意并不容易，鉴于言论自由在民主社会中的重要性，法院判断二人不构成诽谤，宣告无罪。此后，布丽吉特兄妹二人决定向法国最高法院提出上诉。&lt;/p&gt;
&lt;p&gt;根据路透社报道，巴黎上诉法院的判决只是宣告两名被告在诽谤案中无罪，并没有裁定布丽吉特性别问题的真伪。但此后，依然有人断章取义，称诽谤案的败诉更加证明了她的性别存疑。&lt;/p&gt;
&lt;p&gt;起诉诽谤进行的同时，2024年3月8日至11日，远在美国的欧文斯开始在保守派媒体《每日连线》（Daily Wire）的节目中称，布丽吉特出生时是一名男性，随后她在推特上宣称愿意拿自己的“全部职业声誉”来担保。欧文斯的影响力显然是更加巨大的，她在油管上拥有540万订阅，Instagram和X上分别拥有640万和730万粉丝，这个原本只在法国流行过的性别传言被欧文斯推向了全世界。&lt;/p&gt;

    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-91&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-92&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        &lt;p&gt;2025年2月起，欧文斯制作了11期播客，命名为《成为布丽吉特》（Becoming Brigitte），这一系列名称源于格泽维耶·普萨尔（Xavier Poussard）的同名书籍。根据普萨尔的个人网站介绍，他曾工作于法国杂志《事实与文件》（Faits &amp;amp; Document）。《事实与文件》被认为是一家法国极右翼杂志，值得注意的是，据称娜塔莎·雷也是这家杂志的记者，最早就是在此发表了质疑布丽吉特性别的文章。&lt;/p&gt;
&lt;p&gt;欧文斯和普萨尔在这个议题上相互搭台。欧文斯其中一期播客专门采访了普萨尔，据她介绍，此时普萨尔“为了躲避法国极权政府的迫害，不得不举家搬到意大利”。而普萨尔则直接将欧文斯的名字写在了自己作品的封面上，《成为布丽吉特》一书的标题上方写道：“坎迪斯·欧文斯展现一项来自格泽维耶·普萨尔的调查”。&lt;/p&gt;

    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-92&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-93&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        &lt;p&gt;《成为布丽吉特》系列播客仅在油管的总播放量就超过三千万，除性别质疑外，欧文斯还认为布里吉特曾性侵、操纵马克龙，而马克龙是美国中央情报局（CIA）用“精神控制计划”（MKUltra）培养的傀儡。在此期间，马克龙夫妇曾三次向欧文斯发函，要求其撤回言论。但欧文斯更像是将这种回应当作彰显自己影响力的勋章，她会在更新播客的同时把律师函展示在视频中，一边阅读一边进行反驳，并反复强调她就是认为布丽吉特是男性，是马克龙和布丽吉特利用强权压制新闻媒体，向大众掩饰真相。&lt;/p&gt;
&lt;p&gt;阴谋论与假新闻专家托马斯·于雄（Thomas Huchon）向法国国际广播电台（France Inter）表示，2025年3月到5月，欧文斯的系列言论仅法语国家的观看量就超过了十亿次，传播速度和范围前所未有。7月23日，马克龙夫妇正式在美国特拉华州对欧文斯提起诉讼。据报道，诉状有200多页，列出了包括诽谤在内的22项诉因。&lt;/p&gt;
&lt;p&gt;马克龙律师团队主张，欧文斯在明知说法为假或严重缺乏证据的情况下，出于关注度和商业利益的动机依然持续传播虚假消息。马克龙夫妇在起诉书中写道，欧文斯“发起了一场全球性的羞辱运动”，“她将事实扭曲成一种怪诞的叙事，进行煽动和贬低，造成在全球范围内持续的霸凌。”这种谎言给他们夫妇造成了“巨大的伤害”，让他们在现实中出门也要面对这些相信污蔑言论的人。&lt;/p&gt;

    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-93&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-94&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        欧文斯曾多次强调拿自己的“全部职业声誉”来担保自己说的话都是事实，但她的“职业声誉”本身就充满争议。美国主流媒体一般称她为保守派或极右翼评论员，她是MAGA（让美国再次伟大）派的支持者，也是特朗普的黑人年轻女性支持者的代表，为他呼吁更多来自黑人群体的选票。《华盛顿邮报》评价她的政治风格：“一切都是推特上的战场，’怼翻自由派’不仅是电视节目的卖点，更是白宫的议程。”
    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-94&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-95&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        身为一名年轻的黑人女性，欧文斯的政治理念与自己的身份反差极大。她反对黑命贵（Black Lives Matter）运动，否认系统性种族主义的存在，认为非裔美国人一直被“民主党”利用，反对让黑人成为永久受害者的叙事。相反，她认为黑人在社会和法律层面没有受到阻碍。欧文斯还曾公开抨击#MeToo运动，认为这个运动建立的前提是“女人愚蠢、软弱、无关紧要”。
    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-95&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-96&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        &lt;p&gt;由于她激进的言论姿态，媒体曾报道她在美国转折点组织内部也颇具争议，有负责人在推特上公布内部群聊记录显示，柯克不得不提示其他人不要在欧文斯演讲时起哄或者退场。2019年5月，欧文斯在Instagram发布一篇告别贴，宣布辞去美国转折点的职务，但她表示自己仍会出席会议。2021年，欧文斯加入美国保守派媒体《每日连线》，主持以她名字命名的政治脱口秀。在发表布丽吉特是男性的论断不久，她就因被认为发布一系列反犹言论而被辞退。此后，她的主要宣传阵地又重新回到了自己的视频和社交媒体平台。&lt;/p&gt;
&lt;p&gt;对于特朗普来说，欧文斯是个不太稳定的盟友。欧文斯曾在白宫与特朗普会面， 2018年，特朗普曾专门发推特称“坎迪斯·欧文斯正在美国政治产生巨大影响，她代表了一群正在急速扩张的‘非常聪明的思考者’……这对我们的国家非常有好处！”然而最近，欧文斯对特朗普在爱泼斯坦案的处理并不满意，公开发言认为“特朗普背叛了MAGA”。&lt;/p&gt;
&lt;p&gt;在针对马克龙的诉讼中，欧文斯把特朗普也卷了进来。她在节目中表示自己接到了一通来自“高级、傲慢的政府官员”的电话，对方暗示，如果她不闭嘴，俄乌和谈可能会因此受阻。欧文斯还说，自己在2月26日接到了特朗普打来的电话，称马克龙总统访问华盛顿时，拜托特朗普帮忙让欧文斯别再讨论关于他妻子的事。她说特朗普还告诉她，自己近距离看过布里吉特，“她看起来像个女人”。但欧文斯坚持自己的立场，“尊敬的总统先生，那不是我的错。是他自己娶了一个带有男性生理特征的人。”&lt;/p&gt;

    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-96&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-97&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        &lt;p&gt;如今，马克龙夫妇的困境看起来甚至有些荒唐。证明自己是女性听起来简单，但欧文斯的支持者拒绝承认任何文件形式的自证，他们认为照片和文件信息都是可以伪造的，这些都是政府强权下巨大的阴谋。讽刺的是，即便第一夫人成功证明自己为女性，也难以证明欧文斯言论的主观恶意。&lt;/p&gt;
&lt;p&gt;布里吉特也不是第一个遭遇性别质疑的公众人物。在美国，前第一夫人米歇尔·奥巴马和前副总统卡玛拉·哈里斯都曾被指为秘密变性，包括泰勒·斯威夫特，Lady Gaga在内的名人也曾被分析为跨性别女性。这些说法的证明方式都非常类似，通过照片和视频分析一个人的骨骼，来判断这个人出生时的性别，这种行为一般流行于社交媒体，有学者将之称为跨性别调查（Transvestigation）。&lt;/p&gt;
&lt;p&gt;与性相关的话题总是能够天然吸引更多的眼球。跨性别与女性主义本身就是极具争议的话题，跨性别调查的出现也源于更深远的政治环境。皇家墨尔本理工大学高级讲师汤普森（Dr. Jay Daniel Thompson）认为，除了谣言之外，跨性别调查出于道德恐慌，将性别的反转视为与儿童贩卖、恋童癖等并列的社会文化崩坏现象。因此无论是基于反跨性别的立场还是对跨性别人士的负面认知，跨性别调查都是非常适合右翼的政治工具。对于这些说法，有些人是出于八卦，而也有人真的相信，这是某个精英跨性别秘密集团试图掌控某一行业的阴谋。&lt;/p&gt;
&lt;p&gt;但无论阴谋论的内部解释链条有多曲折离奇，他们的基本逻辑却都简单粗暴，预设某个事件背后一定有“隐秘势力”操控，然后有选择性地拼凑证据来印证这一“真相”。欧文斯主张的其他观念包括，认为科学是一种异教信仰，不相信美国登月，反对新冠疫情期间的疫苗和防控措施。她曾表示自己阅读“地平说”理论并不是因为相信地球是平的，而是出于对权威的质疑。根据英国皮尔斯基金会去年的研究，地平说、美国登月和新冠疫苗是在英国青少年最常见的阴谋论话题。&lt;/p&gt;
&lt;p&gt;以欧文斯为代表的美国右翼网红之所以受到追捧，一方面原因是人们渴望听到另一种反精英、反政治正确的声音。由于主流媒体、文化圈和大学体系常年被自由派占据，而自己的生活并没有如他们所说一样变好，这部分群体对主流话语深度不信任，认为政府和媒体没有告诉自己真相。皮尔斯的研究结果显示，11至18岁的青少年对政府的信任度甚至低于对社交媒体网红的信任度。&lt;/p&gt;
&lt;p&gt;另一方面，欧文斯们对复杂问题的解释逻辑又足够简单，直截了当地告诉人们这就是政治集团在掩盖的真相。对于坚持披露布丽吉特性别问题，欧文斯的解释是，她相信激进的信息透明，“我不认为我的追随者是我的粉丝，我将他们视为和我一样的人，我们关心公民有权知道到底是谁在管理我们的国家。”社交媒体算法会放大这些情绪，吸引人转发、评论，为他们带来更多曝光和关注度。&lt;/p&gt;

    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-97&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;
&lt;h2 id=&#34;图像&#34;&gt;图像
&lt;/h2&gt;&lt;div class=&#34;hugo-gallery&#34; id=&#34;gallery-98&#34;&gt;
    &lt;div class=&#34;gallery-inline-layout&#34;&gt;
        
        &lt;div class=&#34;visual-column&#34;&gt;
            &lt;div class=&#34;gallery-viewport&#34;&gt;
                &lt;div class=&#34;gallery-track&#34;&gt;
                    
                        
                        
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20251019-image01.jpg&#34;
                                 data-src=&#34;20251019-image01.jpg&#34; 
                                 data-alt=&#34;罗克河瀑布，上半岛，密歇根州，美国&#34; 
                                 data-desc=&#34;密歇根州罗克河峡谷深处，罗克河瀑布在冰川雕琢的景观中悄然显现，周遭密林环绕，层层历史沉淀。在上半岛这片土地上，人类足迹绵延数千年：原住民阿尔冈昆语族之后，法国与英国探险者接踵而至；19世纪采矿与伐木业繁荣时期，芬兰、瑞典及法裔加拿大移民在此定居。如今这片人烟稀少的区域仅容纳着密歇根州3%的居民，森林与瀑布依旧保留着近乎原始的宁静。   要抵达瀑布，需沿着蜿蜒小径徒步前行，途中松柏参天、枫树成荫，林荫下蕨类与野花尽情舒展。红松鼠穿梭其间，白尾鹿悄然移动，鸥鸟与啄木鸟的鸣叫在海瓦萨国家森林回荡。小径尽头，一道18英尺高的瀑布倾泻而下，汇入清澈水潭。随着季节更替，这里展现出不同的风貌：夏日阳光在水面流转跳跃，秋日将树冠染成绚烂火海，冬日则为岩石披上晶莹冰晶。在罗克河瀑布，每一次造访，都是一次感官与自然灵魂的全新邂逅。&#34;
                                 data-link=&#34;https://cn.bing.com/search?q=%e5%af%86%e6%ad%87%e6%a0%b9%e5%b7%9e%e7%bd%97%e5%85%8b%e6%b2%b3%e8%8d%92%e9%87%8e&amp;amp;form=hpcapt&amp;amp;filters=HpDate:%2220251016_1600%22&amp;#43;mgzv3configlist:%22BingQA_Encyclopedia_Layout%22&#34;&gt;
                                &lt;img src=&#34;20251019-image01.jpg&#34; alt=&#34;罗克河瀑布，上半岛，密歇根州，美国&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20251019-image02.jpg&#34;
                                 data-src=&#34;20251019-image02.jpg&#34; 
                                 data-alt=&#34;欧亚猞猁，西伯利亚&#34; 
                                 data-desc=&#34;想象一只能在森林中悄然隐去的猫科动物——这就是欧亚猞猁。它耳尖上的簇毛和锐利的目光令人过目难忘。作为四种猞猁中体型最大的一种，它体长可达42 英寸，肩高可达30英寸，身形矫健，兼具力量与敏捷。厚实的脚掌不仅能帮助它悄无声息地移动，还像雪鞋一样分散体重，使其能在厚厚的积雪中追逐猎物。它大多在夜间出没，白天则隐匿在灌木丛或岩石洞穴中，夜幕降临才悄然出击，捕猎鹿、野兔和松鼠。   猞猁过着独居生活。雄性和雌性各自占据自己的领地，并通过抓痕和气味标记来宣示主权，就像在森林中留下的秘密讯号。然而，它们神秘的天性并未能保护它们免遭人类的威胁。在20世纪70至80年代，成千上万张猞猁皮从俄罗斯和中国出口，使其数量一度降至危险水平。尽管毛皮贸易限制减轻了压力，但偷猎、栖息地丧失以及猎物减少等问题至今仍对欧亚猞猁构成生存危机。&#34;
                                 data-link=&#34;https://cn.bing.com/search?q=%e6%ac%a7%e4%ba%9a%e7%8c%9e%e7%8c%81&amp;amp;form=hpcapt&amp;amp;filters=HpDate:%2220251015_1600%22&amp;#43;mgzv3configlist:%22BingQA_Encyclopedia_Layout%22&#34;&gt;
                                &lt;img src=&#34;20251019-image02.jpg&#34; alt=&#34;欧亚猞猁，西伯利亚&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20251019-image03.jpg&#34;
                                 data-src=&#34;20251019-image03.jpg&#34; 
                                 data-alt=&#34;紫蜡蘑，西贝克，华盛顿州，美国&#34; 
                                 data-desc=&#34;你知道吗？蘑菇也有属于自己的节日。每年的10月15日是“全国蘑菇日”，这一天邀请我们走进它们奇妙的世界。比如图中的紫蜡蘑，又称“紫晶欺骗菇”。它在幼年时紫色明艳、光彩夺目，但随着时间和环境的变化，颜色逐渐褪去，辨认起来就不那么容易了。尽管外表娇嫩而多变，这种宝石般的真菌不仅可以食用，还在生态系统中发挥着重要作用。   蘑菇远不止是披萨的配料或餐桌上的配菜，它们是生态界的强大力量，对森林的健康至关重要。它们分解枯死物质，循环利用养分，并通过被称为“菌根”的地下网络促进树木生长。有些蘑菇还能帮助土壤储存碳，在气候调节中扮演角色。“全国蘑菇日”鼓励我们保持好奇心。今天，不妨尝试一道新的蘑菇食谱，读一读它们如何守护地球，或者亲身来一次寻菇探险。不过请记住：采摘必须负责任，切勿在没有正确鉴别的情况下食用野生蘑菇，因为其中一些可能有毒。&#34;
                                 data-link=&#34;https://cn.bing.com/search?q=%e7%b4%ab%e8%9c%a1%e8%98%91&amp;amp;form=hpcapt&amp;amp;filters=HpDate:%2220251014_1600%22&amp;#43;mgzv3configlist:%22BingQA_Encyclopedia_Layout%22&#34;&gt;
                                &lt;img src=&#34;20251019-image03.jpg&#34; alt=&#34;紫蜡蘑，西贝克，华盛顿州，美国&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20251019-image04.jpg&#34;
                                 data-src=&#34;20251019-image04.jpg&#34; 
                                 data-alt=&#34;火箭烟迹掠图森&#34; 
                                 data-desc=&#34;你见过这样的日落吗？上个月某天，从美国亚利桑那州图森市西望，夕阳余晖中赫然显现一道奇异的航迹云——那是数分钟前从加利福尼亚州升空的火箭的烟迹。这道烟迹来自加利福尼亚州隆波克市附近范登堡空军基地发射的火箭，在落日背光映照下壮丽夺目，时而宛若巨型太空鱼遨游天际。此次猎鹰9号火箭成功将28颗星链通信卫星送入近地轨道：右侧可见一级火箭的烟迹，左侧烟迹顶端则是翱翔的二级火箭。巨柱仙人掌的枝干、图森市的灯火与远处的图森山脉共同构成了优美的前景。&#34;
                                 data-link=&#34;https://www.bjp.org.cn/APOD/4028c13699e44f570199e588798c0002.shtml&#34;&gt;
                                &lt;img src=&#34;20251019-image04.jpg&#34; alt=&#34;火箭烟迹掠图森&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20251019-image05.jpg&#34;
                                 data-src=&#34;20251019-image05.jpg&#34; 
                                 data-alt=&#34;伊亚镇，圣托里尼岛，希腊&#34; 
                                 data-desc=&#34;你是否曾想过生活在电影布景中是什么感觉？在希腊圣托里尼群岛的伊亚村，这种体验几乎成真。这里曾出现在《牛仔裤的夏天》和《古墓丽影》等影片中。标志性的基克拉迪式建筑——立方体造型、平顶的白色房屋——与悬崖边的壮丽景色，仿佛不属于现实世界。它独特的建筑风格起源于19世纪末，当时的水手和商人直接在火山悬崖上凿建房屋，夏季清凉、冬季温暖。而蓝白相间的粉刷，也不仅仅是为了美观：石灰涂层能让雨水顺流而下并被收集利用。如今，游客可以漫步在鹅卵石铺就的小巷中，参观海军海事博物馆，或登上圣尼古拉斯城堡遗址，欣赏那令人难忘的落日。   伊亚素有“鹰巢”之称，俯瞰着帕利亚岛和尼亚·卡美尼岛这两座火山岛，以及曾在公元前1600年米诺斯火山喷发前与圣托里尼岛相连的特拉西亚岛。而圣托里尼本身，则宛如大海中的一顶岩石王冠——一座半沉入海底的巨大火山口，由公元前1600年的那场喷发塑造，那是人类历史上规模最大、最剧烈的火山爆发之一。&#34;
                                 data-link=&#34;https://cn.bing.com/search?q=%e5%b8%8c%e8%85%8a%e4%bc%8a%e4%ba%9a%e9%95%87&amp;amp;form=hpcapt&amp;amp;filters=HpDate:%2220251013_1600%22&amp;#43;mgzv3configlist:%22BingQA_Encyclopedia_Layout%22&#34;&gt;
                                &lt;img src=&#34;20251019-image05.jpg&#34; alt=&#34;伊亚镇，圣托里尼岛，希腊&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20251019-image06.jpg&#34;
                                 data-src=&#34;20251019-image06.jpg&#34; 
                                 data-alt=&#34;莱蒙树&#34; 
                                 data-desc=&#34;这棵树并未面临危险，因为悬在其上方的C/2025 A6（莱蒙）彗星远在深空，距离地球十分遥远。在穿越内太阳系的旅途中，莱蒙彗星尽管已过近日点，但仍在持续变亮——此刻它正向地球逼近。莱蒙彗星将于下周抵达近地点，届时其亮度预计达到峰值，其距离将缩短至日地间距的一半。虽然仅凭肉眼也有可能观测到莱蒙彗星，但我们更推荐您使用手机摄像头拍摄——前提是您知晓观测方位。莱蒙彗星此前主要在清晨可见，现在北半球的观测者也能在日落后于西方地平线上方寻觅其踪迹。这张照片约十天前拍摄于斯洛文尼亚，静静伫立在前景中的是一棵欧洲山毛榉。  译者注：照片标题“莱蒙树”（Lemmon Tree）一语双关——彗星“莱蒙”（Lemmon）之名源于发现它的莱蒙山天文台，其发音又与“柠檬”（Lemon）谐音；而《柠檬树》（Lemon Tree）是上世纪九十年代风靡全球的英文金曲，歌词中萦绕着怅惘的等待之情。摄影师以此命名作品，恰如其分地呼应了天文爱好者们翘首期盼莱蒙彗星降临的心境。&#34;
                                 data-link=&#34;https://www.bjp.org.cn/APOD/4028c13699df290c0199e04dafcf0002.shtml&#34;&gt;
                                &lt;img src=&#34;20251019-image06.jpg&#34; alt=&#34;莱蒙树&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20251019-image07.jpg&#34;
                                 data-src=&#34;20251019-image07.jpg&#34; 
                                 data-alt=&#34;萨拉纳克湖村，阿迪朗达克山脉，纽约州，美国&#34; 
                                 data-desc=&#34;有些地方只是地图上的一个点，但萨拉纳克湖却是一年四季都吸引游客的热门目的地。尽管名字里带“湖”，这个小镇并不直接坐落在萨拉纳克湖群边，而是位于萨拉纳克河的一段宽阔水域——弗劳尔湖畔。几个世纪以来，这片被称为“阿迪朗达克之都”的地方，一直是原住民狩猎和迁徙的要地。到19世纪末，这里因成为疗养胜地而声名鹊起，爱德华·李文斯顿·特鲁多医生在此开创了肺结核的新鲜空气疗法。那一时期的“疗养小屋”至今依然保存完好。   如今，萨拉纳克湖早已从治病救人转变为治愈无聊的好去处。游客们可以在水道上划桨，攀登高峰，冬天则能体验滑雪和冰钓的乐趣。村子里也同样充满艺术气息，画廊、音乐和社区节庆让文化与户外活动同样重要。本地的商店和餐馆更为旅程增添滋味，从新鲜鳟鱼到精酿啤酒应有尽有。每年举办的冬季嘉年华是最大亮点，其中的冰宫仿佛出自冰雪童话，足以证明这个小镇很懂得如何留下“酷”的印象——不论是氛围，还是温度。&#34;
                                 data-link=&#34;https://cn.bing.com/search?q=%e8%90%a8%e6%8b%89%e7%ba%b3%e5%85%8b%e6%b9%96%e6%9d%91&amp;amp;form=hpcapt&amp;amp;filters=HpDate:%2220251011_1600%22&amp;#43;mgzv3configlist:%22BingQA_Encyclopedia_Layout%22&#34;&gt;
                                &lt;img src=&#34;20251019-image07.jpg&#34; alt=&#34;萨拉纳克湖村，阿迪朗达克山脉，纽约州，美国&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20251019-image08.jpg&#34;
                                 data-src=&#34;20251019-image08.jpg&#34; 
                                 data-alt=&#34;温巴赫峡谷瀑布，巴伐利亚州，德国&#34; 
                                 data-desc=&#34;陡峭的岩石峡谷，湍急的水流，还有如画般的风景：位于贝希特斯加登国家公园拉姆绍附近的温巴赫峡谷，是巴伐利亚最壮观的峡谷之一。在今日图片中，温巴赫溪在约200米长的狭窄岩层间奔流而下，形成层层小瀑布，并在长年累月中于岩石上雕刻出令人惊叹的纹理。色彩斑斓的岩层揭示了数千年前的地质过程。   稳固的木质栈道紧贴悬崖修建，引领游客穿行于这条狭窄峡谷之中。走到尽头，壮阔的温巴赫山谷豁然展开，坐落在瓦茨曼山与霍赫卡尔特山之间，这里也是远足登山的热门起点。自1847年向公众开放以来，峡谷凭借其沉浸式的自然之美持续吸引着各个年龄层的游客。尤其在春季，随着雪水融化、溪流暴涨，峡谷景观更显震撼。在这里徒步，就像进行一场时光之旅，亲眼见证大自然原始而磅礴的力量。&#34;
                                 data-link=&#34;https://cn.bing.com/search?q=%e6%b8%a9%e5%b7%b4%e8%b5%ab%e5%b3%a1%e8%b0%b7&amp;amp;form=hpcapt&amp;amp;filters=HpDate:%2220251012_1600%22&amp;#43;mgzv3configlist:%22BingQA_Encyclopedia_Layout%222&#34;&gt;
                                &lt;img src=&#34;20251019-image08.jpg&#34; alt=&#34;温巴赫峡谷瀑布，巴伐利亚州，德国&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20251019-image09.jpg&#34;
                                 data-src=&#34;20251019-image09.jpg&#34; 
                                 data-alt=&#34;林鸳鸯，美国&#34; 
                                 data-desc=&#34;鸟类无需护照、签证或行李，它们只需展开翅膀，就能随时启程。每年两次，数十亿只候鸟跨越全球，在繁殖地与越冬地之间飞行数千英里。这段壮丽的旅程正是“世界候鸟日”所要强调的。从每年飞行约44000英里的北极燕鸥，到单次飞行就能横跨墨西哥湾的红喉蜂鸟，这些季节性迁徙的鸟儿展现了真正的耐力。该节日定在每年5月和10月的第二个星期六，同时提醒人们候鸟所面临的威胁：栖息地丧失、气候变化以及光污染，都可能干扰它们的迁徙路线。   在这些候鸟中，林鸳鸯尤为值得关注，如今日图片所示。曾因捕猎和栖息地消失而一度面临数量骤减的它们，如今在保护措施和人工巢箱计划的帮助下得以复苏。如今，它们已成为林木茂密的沼泽、湿地和湖泊中的常客。部分林鸳鸯终年栖息于美国南部，而在北方，当寒意袭来时，雌鸭则会南迁，前往更温暖的地区，从美国南部一直到墨西哥。&#34;
                                 data-link=&#34;https://cn.bing.com/search?q=%e4%b8%96%e7%95%8c%e5%80%99%e9%b8%9f%e6%97%a5&amp;amp;form=hpcapt&amp;amp;filters=HpDate:%2220251010_1600%22&amp;#43;mgzv3configlist:%22BingQA_Encyclopedia_Layout%22&#34;&gt;
                                &lt;img src=&#34;20251019-image09.jpg&#34; alt=&#34;林鸳鸯，美国&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20251019-image10.jpg&#34;
                                 data-src=&#34;20251019-image10.jpg&#34; 
                                 data-alt=&#34;莫努里基岛周边的珊瑚礁，玛玛努卡群岛，斐济&#34; 
                                 data-desc=&#34;有些日子只标志着一个里程碑，而斐济的10月10日却见证了两个。1874年的这一天，斐济群岛正式成为英国殖民地。近一个世纪后的1970年，同一天，斐济升起了自己的国旗，宣布独立。斐济日是一个独特的全国性节日——既是反思的时刻，也是庆祝的日子。庆典从庄重的仪式开始，国旗冉冉升起，领导人发表演讲。学校和社区团体常常会举行历史重现或表演活动。街道上挤满了游行队伍，村庄里上演着传统舞蹈“梅克”，橄榄球场上热火朝天。家家户户则准备传统菜肴，比如将肉和根茎类作物埋在地下烤制的“洛沃”，以及用柑橘汁腌制的鱼“科科达”。   如今，自由的精神从繁华的城镇延伸到像莫努里基岛这样的偏远瑰宝，如今日图片所示。这座岛因《荒岛余生》的拍摄而名声大噪，虽无人居住，却绝非死寂。环绕小岛的珊瑚礁宛如天然的堡垒，既能抵御风暴侵袭，又庇护着无数鱼类。斐济的珊瑚礁恰如其分地成为了一个隐喻：坚固、多样且与国家的福祉紧密相连。&#34;
                                 data-link=&#34;https://cn.bing.com/search?q=%e7%8e%9b%e7%8e%9b%e5%8a%aa%e5%8d%a1%e7%be%a4%e5%b2%9b&amp;amp;form=hpcapt&amp;amp;filters=HpDate:%2220251009_1600%22&amp;#43;mgzv3configlist:%22BingQA_Encyclopedia_Layout%22&#34;&gt;
                                &lt;img src=&#34;20251019-image10.jpg&#34; alt=&#34;莫努里基岛周边的珊瑚礁，玛玛努卡群岛，斐济&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20251019-image11.jpg&#34;
                                 data-src=&#34;20251019-image11.jpg&#34; 
                                 data-alt=&#34;距离地球50光年的飞马座51&#34; 
                                 data-desc=&#34;类太阳恒星飞马座51距离地球约50光年。在这张2025年8月拍摄于法国上普罗旺斯天文台的夜空照片中，该恒星的位置在圆顶上方的明亮星群中被标示出来。三十年前的1995年10月，瑞士天文学家米歇尔·麦耶和迪迪埃·奎洛兹在此地宣布了一项重大发现——他们使用精密的光谱仪首次探测到在飞马座51周围有一颗环绕类太阳恒星的系外行星飞马座51b，这也是人类发现的首颗系外行星。通过测量恒星受行星引力影响，径向速度存在周期性变化，推断这颗被命名为飞马座51b的行星质量至少为木星的一半，公转周期仅4.2天，其与母恒星的距离比水星与太阳的距离更小。这项发现迅速获得学界证实，二人于2019年荣获诺贝尔物理学奖。作为“热木星”类系外行星的原型，飞马座51b在2015年被正式命名为Dimidium（拉丁语意为“一半”）。自三十年前的这一发现以来，人类已探测到超6000颗系外行星。&#34;
                                 data-link=&#34;https://www.bjp.org.cn/APOD/4028c13699ca8f9d0199cbde13090012.shtml&#34;&gt;
                                &lt;img src=&#34;20251019-image11.jpg&#34; alt=&#34;距离地球50光年的飞马座51&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                    
                &lt;/div&gt;
            &lt;/div&gt;

            &lt;button class=&#34;nav-btn prev-btn&#34; aria-label=&#34;Previous&#34;&gt;
                &lt;svg width=&#34;24&#34; height=&#34;24&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;polyline points=&#34;15 18 9 12 15 6&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
            &lt;button class=&#34;nav-btn next-btn&#34; aria-label=&#34;Next&#34;&gt;
                &lt;svg width=&#34;24&#34; height=&#34;24&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;polyline points=&#34;9 18 15 12 9 6&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
            
            &lt;div class=&#34;inline-counter&#34;&gt;1 / 1&lt;/div&gt;
        &lt;/div&gt;

        &lt;div class=&#34;info-column&#34;&gt;
            &lt;div class=&#34;info-content-top&#34;&gt;
                &lt;div class=&#34;info-header&#34;&gt;
                    &lt;h3 class=&#34;gallery-title&#34;&gt;&lt;/h3&gt;
                &lt;/div&gt;
                
                &lt;div class=&#34;info-card&#34;&gt;
                    &lt;div class=&#34;info-body&#34;&gt;
                        &lt;p class=&#34;gallery-desc&#34;&gt;&lt;/p&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
            &lt;/div&gt;

            &lt;div class=&#34;info-footer&#34;&gt;
                &lt;div class=&#34;gallery-thumbs&#34;&gt;&lt;/div&gt;
            &lt;/div&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;gallery-lightbox&#34;&gt;
        &lt;div class=&#34;lb-toolbar&#34;&gt;
            &lt;span class=&#34;lb-counter&#34;&gt;&lt;/span&gt;
            &lt;div class=&#34;lb-actions&#34;&gt;
                &lt;a class=&#34;lb-btn lb-link-btn&#34; href=&#34;#&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; title=&#34;打开链接/原图&#34;&gt;
                    &lt;svg width=&#34;20&#34; height=&#34;20&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
                &lt;/a&gt;
                &lt;button class=&#34;lb-btn lb-close-btn&#34; title=&#34;关闭&#34;&gt;
                    &lt;svg width=&#34;24&#34; height=&#34;24&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34;&gt;&lt;line x1=&#34;18&#34; y1=&#34;6&#34; x2=&#34;6&#34; y2=&#34;18&#34;&gt;&lt;/line&gt;&lt;line x1=&#34;6&#34; y1=&#34;6&#34; x2=&#34;18&#34; y2=&#34;18&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
                &lt;/button&gt;
            &lt;/div&gt;
        &lt;/div&gt;
        &lt;div class=&#34;lb-canvas&#34;&gt;
            &lt;button class=&#34;lb-nav lb-prev&#34;&gt;
                &lt;svg width=&#34;36&#34; height=&#34;36&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34;&gt;&lt;polyline points=&#34;15 18 9 12 15 6&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
            &lt;div class=&#34;lb-img-wrapper&#34;&gt;
                &lt;img class=&#34;lb-img&#34; src=&#34;&#34; alt=&#34;&#34;&gt;
            &lt;/div&gt;
            &lt;button class=&#34;lb-nav lb-next&#34;&gt;
                &lt;svg width=&#34;36&#34; height=&#34;36&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34;&gt;&lt;polyline points=&#34;9 18 15 12 9 6&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

&lt;style&gt;
     
    .hugo-gallery {
        --g-bg: #ffffff;
        --g-border: #e0e0e0;
        --g-visual-bg: #111;
        --g-text-main: inherit; 
        --g-text-sub: #555;
        --g-card-bg: #f7f9fc;
        --g-card-border: #3b82f6;
        --g-thumb-active: #3b82f6;

        position: relative;
        margin: 2em 0;
        background: var(--g-bg);
        border: 1px solid var(--g-border);
        font-family: inherit; 
        box-sizing: border-box;
    }
    .hugo-gallery * { box-sizing: border-box; }

     
    [data-scheme=&#34;dark&#34;] .hugo-gallery,
    html[data-theme=&#34;dark&#34;] .hugo-gallery,
    body.dark .hugo-gallery {
        --g-bg: #1e1e1e;
        --g-border: #333;
        --g-visual-bg: #000;
        --g-text-sub: #aaa;
        --g-card-bg: #252526;
        --g-card-border: #60a5fa;
        --g-thumb-active: #60a5fa;
    }
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .hugo-gallery {
            --g-bg: #1e1e1e;
            --g-border: #333;
            --g-visual-bg: #000;
            --g-text-sub: #aaa;
            --g-card-bg: #252526;
            --g-card-border: #60a5fa;
            --g-thumb-active: #60a5fa;
        }
    }

     
    .gallery-inline-layout {
        display: grid;
        grid-template-columns: 2fr 1.2fr; 
        height: 550px; 
    }

     
    .visual-column {
        position: relative;
        background: var(--g-visual-bg);
        overflow: hidden;
        display: flex; align-items: center; justify-content: center;
    }
    .gallery-viewport { width: 100%; height: 100%; cursor: zoom-in; }
    .gallery-track { display: flex; height: 100%; transition: transform 0.3s ease; }
    .gallery-slide { 
        flex: 0 0 100%; width: 100%; height: 100%; 
        display: flex; align-items: center; justify-content: center; 
    }
    .gallery-slide img { 
        max-width: 100%; max-height: 100%; 
        object-fit: contain; display: block; 
    }

    .nav-btn {
        position: absolute; top: 50%; transform: translateY(-50%);
        width: 40px; height: 40px;
        background: rgba(255,255,255,0.9);
        border: none; border-radius: 50%; 
        cursor: pointer; color: #000;
        display: flex; align-items: center; justify-content: center;
        opacity: 0; transition: opacity 0.2s; z-index: 10;
    }
    .visual-column:hover .nav-btn { opacity: 1; }
    .prev-btn { left: 15px; }
    .next-btn { right: 15px; }
    .inline-counter {
        position: absolute; top: 15px; right: 15px;
        background: rgba(0,0,0,0.6); color: #fff;
        padding: 4px 8px; border-radius: 4px;
        font-size: 0.85em; pointer-events: none;
    }

     
    .info-column {
        display: flex; flex-direction: column;
        padding: 25px;
        background: var(--g-bg);
        border-left: 1px solid var(--g-border);
        overflow: hidden; 
        color: var(--g-text-main);
        justify-content: flex-start; 
        height: 100%;  
    }
    
    .info-content-top {
         
        flex: 1; 
        display: flex; 
        flex-direction: column;
        min-height: 0;  
        overflow: hidden;  
    }

    .info-header { margin-bottom: 20px; flex-shrink: 0; }
    .gallery-title { margin: 0; line-height: 1.3; color: inherit; }

    .info-card {
         
        flex: 1;
        display: flex; flex-direction: column;
        margin-bottom: 20px; background: var(--g-card-bg);
        border-left: 4px solid var(--g-card-border);
        border-radius: 0 4px 4px 0;
        min-height: 0;  
    }
    .info-body {
         
        flex: 1;
        overflow-y: auto; 
        padding: 15px 20px; 
        scrollbar-width: thin;
    }
    .gallery-desc { 
        margin: 0; color: var(--g-text-sub); 
        line-height: 1.6; white-space: pre-wrap; 
    }
    
     
    .info-footer { 
        flex-shrink: 0; 
        margin-top: auto; 
        padding-top: 20px;
    }
    
    .gallery-thumbs { 
         
        position: relative;
        display: flex; gap: 10px; flex-wrap: wrap; 
        align-items: flex-start;
        max-height: 130px; 
        overflow-y: auto;
        scrollbar-width: thin;
    }
    .hugo-gallery .gallery-thumbs .g-thumb {
        width: 50px !important; height: 50px !important; 
        min-width: 50px !important; min-height: 50px !important;
        flex-shrink: 0; cursor: pointer; opacity: 0.6;
        border: 2px solid transparent; border-radius: 6px; 
        overflow: hidden; position: relative; background: #eee;
        padding: 0 !important; margin: 0 !important;
    }
    .hugo-gallery .gallery-thumbs .g-thumb img { 
        width: 100% !important; height: 100% !important; 
        object-fit: cover !important; display: block !important;
        margin: 0 !important; padding: 0 !important; max-width: none !important;
    }
    .hugo-gallery .gallery-thumbs .g-thumb:hover { opacity: 0.9; }
    .hugo-gallery .gallery-thumbs .g-thumb.active { 
        opacity: 1; border-color: var(--g-thumb-active); 
        box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.2);
    }

     
    @media (max-width: 768px) {
        .gallery-inline-layout { grid-template-columns: 1fr; grid-template-rows: 60vw auto; height: auto; }
        .visual-column { height: 100%; min-height: 250px; }
        .info-column { border-left: none; border-top: 1px solid var(--g-border); height: 400px; padding: 20px; }
        .info-card { background: transparent; border-left: none; padding-left: 0; }
        .info-body { padding: 0; }
        .info-footer { margin-top: auto; }
    }

     
    .gallery-lightbox {
        position: fixed; inset: 0; z-index: 99999;
        background: #000; display: none; flex-direction: column;
        opacity: 0; transition: opacity 0.2s; user-select: none;
    }
    .gallery-lightbox.active { display: flex; opacity: 1; }
    .lb-toolbar {
        position: absolute; top: 0; left: 0; width: 100%; height: 60px;
        display: flex; justify-content: space-between; align-items: center;
        padding: 0 20px; z-index: 20; background: rgba(0,0,0,0.6);
    }
    .lb-counter { color: #ccc; font-size: 0.9em; }
    .lb-actions { display: flex; gap: 15px; }
    .lb-btn { background: transparent; border: none; color: #ddd; cursor: pointer; display: flex; align-items: center; }
    .lb-btn:hover { color: #fff; }
    .lb-canvas {
        flex: 1; width: 100%; height: 100%; position: relative; overflow: hidden;
        display: flex; align-items: center; justify-content: center;
    }
    .lb-img-wrapper { width: 100%; height: 100%; display: flex; align-items: center; justify-content: center; }
    .lb-img { max-width: 100%; max-height: 100%; object-fit: contain; transform-origin: center; will-change: transform; }
    .lb-nav {
        position: absolute; top: 50%; transform: translateY(-50%);
        background: transparent; border: none; color: rgba(255,255,255,0.5);
        padding: 20px; cursor: pointer; z-index: 10;
    }
    .lb-nav:hover { color: #fff; }
    .lb-prev { left: 10px; } .lb-next { right: 10px; }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const galleryId = &#34;gallery-98&#34;;
        const root = document.getElementById(galleryId);
        if (!root) return;

        const track = root.querySelector(&#39;.gallery-track&#39;);
        const slides = Array.from(track.querySelectorAll(&#39;.gallery-slide&#39;));
        if (slides.length === 0) return;

        const titleEl = root.querySelector(&#39;.gallery-title&#39;);
        const descEl = root.querySelector(&#39;.gallery-desc&#39;);
        const counterEl = root.querySelector(&#39;.inline-counter&#39;);
        const thumbsContainer = root.querySelector(&#39;.gallery-thumbs&#39;);
        const infoCard = root.querySelector(&#39;.info-card&#39;);

        const lb = root.querySelector(&#39;.gallery-lightbox&#39;);
        const lbImg = lb.querySelector(&#39;.lb-img&#39;);
        const lbCounter = lb.querySelector(&#39;.lb-counter&#39;);
        const lbLinkBtn = lb.querySelector(&#39;.lb-link-btn&#39;); 
        
        let currentIndex = 0;
        const total = slides.length;
        
        let zoomLevel = 1; let panX = 0, panY = 0; 
        let startX = 0, startY = 0; let initialPanX = 0, initialPanY = 0; 
        let isDragging = false; let hasMoved = false; 
        
        slides.forEach((s, i) =&gt; {
            const thumbSrc = s.dataset.thumb || s.querySelector(&#39;img&#39;).src;
            const t = document.createElement(&#39;div&#39;);
            t.className = i === 0 ? &#39;g-thumb active&#39; : &#39;g-thumb&#39;;
            t.innerHTML = `&lt;img src=&#34;${thumbSrc}&#34; loading=&#34;lazy&#34;&gt;`;
            t.onclick = (e) =&gt; { e.stopPropagation(); switchTo(i); };
            thumbsContainer.appendChild(t);
        });
        const thumbs = thumbsContainer.querySelectorAll(&#39;.g-thumb&#39;);

        
        function safeScrollThumb(container, thumb) {
            if (!container || !thumb) return;
            
            
            const thumbTop = thumb.offsetTop;
            const thumbHeight = thumb.offsetHeight;
            const containerScrollTop = container.scrollTop;
            const containerHeight = container.clientHeight;

            
            if (thumbTop &lt; containerScrollTop) {
                
                container.scrollTop = thumbTop;
            } else if (thumbTop + thumbHeight &gt; containerScrollTop + containerHeight) {
                
                container.scrollTop = thumbTop + thumbHeight - containerHeight;
            }
        }

        function switchTo(index) {
            if (index &lt; 0) index = total - 1;
            if (index &gt;= total) index = 0;
            currentIndex = index;

            track.style.transform = `translateX(${-100 * index}%)`;
            const s = slides[index];
            
            const title = s.dataset.alt || &#34;&#34;;
            const desc = s.dataset.desc || &#34;&#34;;
            
            titleEl.textContent = title;
            descEl.textContent = desc;
            
            titleEl.parentElement.style.display = title ? &#39;block&#39; : &#39;none&#39;;
            if (desc) {
                infoCard.style.display = &#39;flex&#39;;
            } else {
                infoCard.style.display = &#39;none&#39;;
            }
            
            counterEl.textContent = `${index + 1} / ${total}`;

            thumbs.forEach(t =&gt; t.classList.remove(&#39;active&#39;));
            if (thumbs[index]) {
                thumbs[index].classList.add(&#39;active&#39;);
                safeScrollThumb(thumbsContainer, thumbs[index]);
            }

            if (lb.classList.contains(&#39;active&#39;)) {
                updateLightboxImage(index);
            }
        }

        function openLightbox() {
            updateLightboxImage(currentIndex);
            lb.classList.add(&#39;active&#39;);
            document.body.style.overflow = &#39;hidden&#39;; 
        }

        function closeLightbox() {
            lb.classList.remove(&#39;active&#39;);
            document.body.style.overflow = &#39;&#39;;
            setTimeout(resetZoom, 200);
        }

        function updateLightboxImage(index) {
            resetZoom(); 
            lbImg.style.opacity = 0.5;
            const s = slides[index];
            const targetLink = s.dataset.link || s.dataset.src;
            lbLinkBtn.href = targetLink;
            const tempImg = new Image();
            tempImg.src = s.dataset.src;
            tempImg.onload = () =&gt; {
                lbImg.src = s.dataset.src;
                lbImg.style.opacity = 1;
            };
            lbCounter.textContent = `${index + 1} / ${total}`;
        }

        function updateTransform() {
            lbImg.style.transform = `translate(${panX}px, ${panY}px) scale(${zoomLevel})`;
        }

        function resetZoom() {
            zoomLevel = 1; panX = 0; panY = 0;
            lbImg.style.transform = &#39;&#39;;
            lbImg.style.transition = &#39;transform 0.3s ease&#39;; 
        }

        lbImg.addEventListener(&#39;wheel&#39;, (e) =&gt; {
            e.preventDefault();
            const delta = e.deltaY * -0.01;
            zoomLevel = Math.min(Math.max(1, zoomLevel + delta), 5); 
            if (zoomLevel === 1) { panX = 0; panY = 0; }
            lbImg.style.transition = &#39;none&#39;; 
            updateTransform();
        });

        function onDragStart(e) {
            if (zoomLevel &lt;= 1) return; 
            e.preventDefault();
            isDragging = true; hasMoved = false; 
            startX = e.type.includes(&#39;mouse&#39;) ? e.pageX : e.touches[0].pageX;
            startY = e.type.includes(&#39;mouse&#39;) ? e.pageY : e.touches[0].pageY;
            initialPanX = panX; initialPanY = panY;
            lbImg.style.transition = &#39;none&#39;; 
        }

        function onDragMove(e) {
            if (!isDragging) return;
            e.preventDefault();
            const currentX = e.type.includes(&#39;mouse&#39;) ? e.pageX : e.touches[0].pageX;
            const currentY = e.type.includes(&#39;mouse&#39;) ? e.pageY : e.touches[0].pageY;
            const diffX = currentX - startX; const diffY = currentY - startY;
            if (Math.abs(diffX) &gt; 2 || Math.abs(diffY) &gt; 2) hasMoved = true;
            panX = initialPanX + diffX; panY = initialPanY + diffY;
            updateTransform();
        }

        function onDragEnd(e) {
            if (!isDragging) return;
            isDragging = false;
            lbImg.style.transition = &#39;transform 0.1s linear&#39;; 
        }

        lbImg.addEventListener(&#39;click&#39;, (e) =&gt; {
            e.stopPropagation();
            if (hasMoved) { hasMoved = false; return; }
            if (zoomLevel &gt; 1) { resetZoom(); } 
            else { zoomLevel = 2.5; lbImg.style.transition = &#39;transform 0.3s cubic-bezier(0.25, 0.8, 0.25, 1)&#39;; updateTransform(); }
        });

        lbImg.addEventListener(&#39;mousedown&#39;, onDragStart);
        lbImg.addEventListener(&#39;touchstart&#39;, onDragStart);
        window.addEventListener(&#39;mousemove&#39;, onDragMove);
        window.addEventListener(&#39;touchmove&#39;, onDragMove, { passive: false });
        window.addEventListener(&#39;mouseup&#39;, onDragEnd);
        window.addEventListener(&#39;touchend&#39;, onDragEnd);

        root.querySelector(&#39;.gallery-track&#39;).onclick = () =&gt; openLightbox();

        const bindNav = (btn, dir) =&gt; {
            btn.onclick = (e) =&gt; {
                e.preventDefault(); e.stopImmediatePropagation(); 
                switchTo(currentIndex + dir);
            };
        };

        bindNav(root.querySelector(&#39;.prev-btn&#39;), -1);
        bindNav(root.querySelector(&#39;.next-btn&#39;), 1);
        bindNav(lb.querySelector(&#39;.lb-prev&#39;), -1);
        bindNav(lb.querySelector(&#39;.lb-next&#39;), 1);

        lb.querySelector(&#39;.lb-close-btn&#39;).onclick = (e) =&gt; { e.stopPropagation(); closeLightbox(); };
        lbLinkBtn.onclick = (e) =&gt; { e.stopPropagation(); };

        lb.onclick = (e) =&gt; {
            if (e.target === lb || e.target.classList.contains(&#39;lb-canvas&#39;)) closeLightbox();
        };

        document.addEventListener(&#39;keydown&#39;, (e) =&gt; {
            if (!lb.classList.contains(&#39;active&#39;)) return;
            if (e.key === &#39;ArrowLeft&#39;) switchTo(currentIndex - 1);
            if (e.key === &#39;ArrowRight&#39;) switchTo(currentIndex + 1);
            if (e.key === &#39;Escape&#39;) closeLightbox();
        });

        
        switchTo(0);
    })();
&lt;/script&gt;
&lt;div class=&#34;hugo-gallery&#34; id=&#34;gallery-99&#34;&gt;
    &lt;div class=&#34;gallery-inline-layout&#34;&gt;
        
        &lt;div class=&#34;visual-column&#34;&gt;
            &lt;div class=&#34;gallery-viewport&#34;&gt;
                &lt;div class=&#34;gallery-track&#34;&gt;
                    
                        
                        
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20251019-image12.jpg&#34;
                                 data-src=&#34;20251019-image12.jpg&#34; 
                                 data-alt=&#34;禅意的东方美学 | 摄影师Paul Cupido&#34; 
                                 data-desc=&#34;禅意的东方美学 | 摄影师Paul Cupido&#34;
                                 data-link=&#34;http://www.cnu.cc/works/673240&#34;&gt;
                                &lt;img src=&#34;20251019-image12.jpg&#34; alt=&#34;禅意的东方美学 | 摄影师Paul Cupido&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20251019-image13.jpg&#34;
                                 data-src=&#34;20251019-image13.jpg&#34; 
                                 data-alt=&#34;禅意的东方美学 | 摄影师Paul Cupido&#34; 
                                 data-desc=&#34;禅意的东方美学 | 摄影师Paul Cupido&#34;
                                 data-link=&#34;http://www.cnu.cc/works/673240&#34;&gt;
                                &lt;img src=&#34;20251019-image13.jpg&#34; alt=&#34;禅意的东方美学 | 摄影师Paul Cupido&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20251019-image14.jpg&#34;
                                 data-src=&#34;20251019-image14.jpg&#34; 
                                 data-alt=&#34;禅意的东方美学 | 摄影师Paul Cupido&#34; 
                                 data-desc=&#34;禅意的东方美学 | 摄影师Paul Cupido&#34;
                                 data-link=&#34;http://www.cnu.cc/works/673240&#34;&gt;
                                &lt;img src=&#34;20251019-image14.jpg&#34; alt=&#34;禅意的东方美学 | 摄影师Paul Cupido&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20251019-image15.jpg&#34;
                                 data-src=&#34;20251019-image15.jpg&#34; 
                                 data-alt=&#34;禅意的东方美学 | 摄影师Paul Cupido&#34; 
                                 data-desc=&#34;禅意的东方美学 | 摄影师Paul Cupido&#34;
                                 data-link=&#34;http://www.cnu.cc/works/673240&#34;&gt;
                                &lt;img src=&#34;20251019-image15.jpg&#34; alt=&#34;禅意的东方美学 | 摄影师Paul Cupido&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20251019-image16.jpg&#34;
                                 data-src=&#34;20251019-image16.jpg&#34; 
                                 data-alt=&#34;禅意的东方美学 | 摄影师Paul Cupido&#34; 
                                 data-desc=&#34;禅意的东方美学 | 摄影师Paul Cupido&#34;
                                 data-link=&#34;http://www.cnu.cc/works/673240&#34;&gt;
                                &lt;img src=&#34;20251019-image16.jpg&#34; alt=&#34;禅意的东方美学 | 摄影师Paul Cupido&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20251019-image17.jpg&#34;
                                 data-src=&#34;20251019-image17.jpg&#34; 
                                 data-alt=&#34;禅意的东方美学 | 摄影师Paul Cupido&#34; 
                                 data-desc=&#34;禅意的东方美学 | 摄影师Paul Cupido&#34;
                                 data-link=&#34;http://www.cnu.cc/works/673240&#34;&gt;
                                &lt;img src=&#34;20251019-image17.jpg&#34; alt=&#34;禅意的东方美学 | 摄影师Paul Cupido&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20251019-image18.jpg&#34;
                                 data-src=&#34;20251019-image18.jpg&#34; 
                                 data-alt=&#34;禅意的东方美学 | 摄影师Paul Cupido&#34; 
                                 data-desc=&#34;禅意的东方美学 | 摄影师Paul Cupido&#34;
                                 data-link=&#34;http://www.cnu.cc/works/673240&#34;&gt;
                                &lt;img src=&#34;20251019-image18.jpg&#34; alt=&#34;禅意的东方美学 | 摄影师Paul Cupido&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20251019-image19.jpg&#34;
                                 data-src=&#34;20251019-image19.jpg&#34; 
                                 data-alt=&#34;禅意的东方美学 | 摄影师Paul Cupido&#34; 
                                 data-desc=&#34;禅意的东方美学 | 摄影师Paul Cupido&#34;
                                 data-link=&#34;http://www.cnu.cc/works/673240&#34;&gt;
                                &lt;img src=&#34;20251019-image19.jpg&#34; alt=&#34;禅意的东方美学 | 摄影师Paul Cupido&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20251019-image20.jpg&#34;
                                 data-src=&#34;20251019-image20.jpg&#34; 
                                 data-alt=&#34;禅意的东方美学 | 摄影师Paul Cupido&#34; 
                                 data-desc=&#34;禅意的东方美学 | 摄影师Paul Cupido&#34;
                                 data-link=&#34;http://www.cnu.cc/works/673240&#34;&gt;
                                &lt;img src=&#34;20251019-image20.jpg&#34; alt=&#34;禅意的东方美学 | 摄影师Paul Cupido&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                    
                &lt;/div&gt;
            &lt;/div&gt;

            &lt;button class=&#34;nav-btn prev-btn&#34; aria-label=&#34;Previous&#34;&gt;
                &lt;svg width=&#34;24&#34; height=&#34;24&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;polyline points=&#34;15 18 9 12 15 6&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
            &lt;button class=&#34;nav-btn next-btn&#34; aria-label=&#34;Next&#34;&gt;
                &lt;svg width=&#34;24&#34; height=&#34;24&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;polyline points=&#34;9 18 15 12 9 6&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
            
            &lt;div class=&#34;inline-counter&#34;&gt;1 / 1&lt;/div&gt;
        &lt;/div&gt;

        &lt;div class=&#34;info-column&#34;&gt;
            &lt;div class=&#34;info-content-top&#34;&gt;
                &lt;div class=&#34;info-header&#34;&gt;
                    &lt;h3 class=&#34;gallery-title&#34;&gt;&lt;/h3&gt;
                &lt;/div&gt;
                
                &lt;div class=&#34;info-card&#34;&gt;
                    &lt;div class=&#34;info-body&#34;&gt;
                        &lt;p class=&#34;gallery-desc&#34;&gt;&lt;/p&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
            &lt;/div&gt;

            &lt;div class=&#34;info-footer&#34;&gt;
                &lt;div class=&#34;gallery-thumbs&#34;&gt;&lt;/div&gt;
            &lt;/div&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;gallery-lightbox&#34;&gt;
        &lt;div class=&#34;lb-toolbar&#34;&gt;
            &lt;span class=&#34;lb-counter&#34;&gt;&lt;/span&gt;
            &lt;div class=&#34;lb-actions&#34;&gt;
                &lt;a class=&#34;lb-btn lb-link-btn&#34; href=&#34;#&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; title=&#34;打开链接/原图&#34;&gt;
                    &lt;svg width=&#34;20&#34; height=&#34;20&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
                &lt;/a&gt;
                &lt;button class=&#34;lb-btn lb-close-btn&#34; title=&#34;关闭&#34;&gt;
                    &lt;svg width=&#34;24&#34; height=&#34;24&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34;&gt;&lt;line x1=&#34;18&#34; y1=&#34;6&#34; x2=&#34;6&#34; y2=&#34;18&#34;&gt;&lt;/line&gt;&lt;line x1=&#34;6&#34; y1=&#34;6&#34; x2=&#34;18&#34; y2=&#34;18&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
                &lt;/button&gt;
            &lt;/div&gt;
        &lt;/div&gt;
        &lt;div class=&#34;lb-canvas&#34;&gt;
            &lt;button class=&#34;lb-nav lb-prev&#34;&gt;
                &lt;svg width=&#34;36&#34; height=&#34;36&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34;&gt;&lt;polyline points=&#34;15 18 9 12 15 6&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
            &lt;div class=&#34;lb-img-wrapper&#34;&gt;
                &lt;img class=&#34;lb-img&#34; src=&#34;&#34; alt=&#34;&#34;&gt;
            &lt;/div&gt;
            &lt;button class=&#34;lb-nav lb-next&#34;&gt;
                &lt;svg width=&#34;36&#34; height=&#34;36&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34;&gt;&lt;polyline points=&#34;9 18 15 12 9 6&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

&lt;style&gt;
     
    .hugo-gallery {
        --g-bg: #ffffff;
        --g-border: #e0e0e0;
        --g-visual-bg: #111;
        --g-text-main: inherit; 
        --g-text-sub: #555;
        --g-card-bg: #f7f9fc;
        --g-card-border: #3b82f6;
        --g-thumb-active: #3b82f6;

        position: relative;
        margin: 2em 0;
        background: var(--g-bg);
        border: 1px solid var(--g-border);
        font-family: inherit; 
        box-sizing: border-box;
    }
    .hugo-gallery * { box-sizing: border-box; }

     
    [data-scheme=&#34;dark&#34;] .hugo-gallery,
    html[data-theme=&#34;dark&#34;] .hugo-gallery,
    body.dark .hugo-gallery {
        --g-bg: #1e1e1e;
        --g-border: #333;
        --g-visual-bg: #000;
        --g-text-sub: #aaa;
        --g-card-bg: #252526;
        --g-card-border: #60a5fa;
        --g-thumb-active: #60a5fa;
    }
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .hugo-gallery {
            --g-bg: #1e1e1e;
            --g-border: #333;
            --g-visual-bg: #000;
            --g-text-sub: #aaa;
            --g-card-bg: #252526;
            --g-card-border: #60a5fa;
            --g-thumb-active: #60a5fa;
        }
    }

     
    .gallery-inline-layout {
        display: grid;
        grid-template-columns: 2fr 1.2fr; 
        height: 550px; 
    }

     
    .visual-column {
        position: relative;
        background: var(--g-visual-bg);
        overflow: hidden;
        display: flex; align-items: center; justify-content: center;
    }
    .gallery-viewport { width: 100%; height: 100%; cursor: zoom-in; }
    .gallery-track { display: flex; height: 100%; transition: transform 0.3s ease; }
    .gallery-slide { 
        flex: 0 0 100%; width: 100%; height: 100%; 
        display: flex; align-items: center; justify-content: center; 
    }
    .gallery-slide img { 
        max-width: 100%; max-height: 100%; 
        object-fit: contain; display: block; 
    }

    .nav-btn {
        position: absolute; top: 50%; transform: translateY(-50%);
        width: 40px; height: 40px;
        background: rgba(255,255,255,0.9);
        border: none; border-radius: 50%; 
        cursor: pointer; color: #000;
        display: flex; align-items: center; justify-content: center;
        opacity: 0; transition: opacity 0.2s; z-index: 10;
    }
    .visual-column:hover .nav-btn { opacity: 1; }
    .prev-btn { left: 15px; }
    .next-btn { right: 15px; }
    .inline-counter {
        position: absolute; top: 15px; right: 15px;
        background: rgba(0,0,0,0.6); color: #fff;
        padding: 4px 8px; border-radius: 4px;
        font-size: 0.85em; pointer-events: none;
    }

     
    .info-column {
        display: flex; flex-direction: column;
        padding: 25px;
        background: var(--g-bg);
        border-left: 1px solid var(--g-border);
        overflow: hidden; 
        color: var(--g-text-main);
        justify-content: flex-start; 
        height: 100%;  
    }
    
    .info-content-top {
         
        flex: 1; 
        display: flex; 
        flex-direction: column;
        min-height: 0;  
        overflow: hidden;  
    }

    .info-header { margin-bottom: 20px; flex-shrink: 0; }
    .gallery-title { margin: 0; line-height: 1.3; color: inherit; }

    .info-card {
         
        flex: 1;
        display: flex; flex-direction: column;
        margin-bottom: 20px; background: var(--g-card-bg);
        border-left: 4px solid var(--g-card-border);
        border-radius: 0 4px 4px 0;
        min-height: 0;  
    }
    .info-body {
         
        flex: 1;
        overflow-y: auto; 
        padding: 15px 20px; 
        scrollbar-width: thin;
    }
    .gallery-desc { 
        margin: 0; color: var(--g-text-sub); 
        line-height: 1.6; white-space: pre-wrap; 
    }
    
     
    .info-footer { 
        flex-shrink: 0; 
        margin-top: auto; 
        padding-top: 20px;
    }
    
    .gallery-thumbs { 
         
        position: relative;
        display: flex; gap: 10px; flex-wrap: wrap; 
        align-items: flex-start;
        max-height: 130px; 
        overflow-y: auto;
        scrollbar-width: thin;
    }
    .hugo-gallery .gallery-thumbs .g-thumb {
        width: 50px !important; height: 50px !important; 
        min-width: 50px !important; min-height: 50px !important;
        flex-shrink: 0; cursor: pointer; opacity: 0.6;
        border: 2px solid transparent; border-radius: 6px; 
        overflow: hidden; position: relative; background: #eee;
        padding: 0 !important; margin: 0 !important;
    }
    .hugo-gallery .gallery-thumbs .g-thumb img { 
        width: 100% !important; height: 100% !important; 
        object-fit: cover !important; display: block !important;
        margin: 0 !important; padding: 0 !important; max-width: none !important;
    }
    .hugo-gallery .gallery-thumbs .g-thumb:hover { opacity: 0.9; }
    .hugo-gallery .gallery-thumbs .g-thumb.active { 
        opacity: 1; border-color: var(--g-thumb-active); 
        box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.2);
    }

     
    @media (max-width: 768px) {
        .gallery-inline-layout { grid-template-columns: 1fr; grid-template-rows: 60vw auto; height: auto; }
        .visual-column { height: 100%; min-height: 250px; }
        .info-column { border-left: none; border-top: 1px solid var(--g-border); height: 400px; padding: 20px; }
        .info-card { background: transparent; border-left: none; padding-left: 0; }
        .info-body { padding: 0; }
        .info-footer { margin-top: auto; }
    }

     
    .gallery-lightbox {
        position: fixed; inset: 0; z-index: 99999;
        background: #000; display: none; flex-direction: column;
        opacity: 0; transition: opacity 0.2s; user-select: none;
    }
    .gallery-lightbox.active { display: flex; opacity: 1; }
    .lb-toolbar {
        position: absolute; top: 0; left: 0; width: 100%; height: 60px;
        display: flex; justify-content: space-between; align-items: center;
        padding: 0 20px; z-index: 20; background: rgba(0,0,0,0.6);
    }
    .lb-counter { color: #ccc; font-size: 0.9em; }
    .lb-actions { display: flex; gap: 15px; }
    .lb-btn { background: transparent; border: none; color: #ddd; cursor: pointer; display: flex; align-items: center; }
    .lb-btn:hover { color: #fff; }
    .lb-canvas {
        flex: 1; width: 100%; height: 100%; position: relative; overflow: hidden;
        display: flex; align-items: center; justify-content: center;
    }
    .lb-img-wrapper { width: 100%; height: 100%; display: flex; align-items: center; justify-content: center; }
    .lb-img { max-width: 100%; max-height: 100%; object-fit: contain; transform-origin: center; will-change: transform; }
    .lb-nav {
        position: absolute; top: 50%; transform: translateY(-50%);
        background: transparent; border: none; color: rgba(255,255,255,0.5);
        padding: 20px; cursor: pointer; z-index: 10;
    }
    .lb-nav:hover { color: #fff; }
    .lb-prev { left: 10px; } .lb-next { right: 10px; }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const galleryId = &#34;gallery-99&#34;;
        const root = document.getElementById(galleryId);
        if (!root) return;

        const track = root.querySelector(&#39;.gallery-track&#39;);
        const slides = Array.from(track.querySelectorAll(&#39;.gallery-slide&#39;));
        if (slides.length === 0) return;

        const titleEl = root.querySelector(&#39;.gallery-title&#39;);
        const descEl = root.querySelector(&#39;.gallery-desc&#39;);
        const counterEl = root.querySelector(&#39;.inline-counter&#39;);
        const thumbsContainer = root.querySelector(&#39;.gallery-thumbs&#39;);
        const infoCard = root.querySelector(&#39;.info-card&#39;);

        const lb = root.querySelector(&#39;.gallery-lightbox&#39;);
        const lbImg = lb.querySelector(&#39;.lb-img&#39;);
        const lbCounter = lb.querySelector(&#39;.lb-counter&#39;);
        const lbLinkBtn = lb.querySelector(&#39;.lb-link-btn&#39;); 
        
        let currentIndex = 0;
        const total = slides.length;
        
        let zoomLevel = 1; let panX = 0, panY = 0; 
        let startX = 0, startY = 0; let initialPanX = 0, initialPanY = 0; 
        let isDragging = false; let hasMoved = false; 
        
        slides.forEach((s, i) =&gt; {
            const thumbSrc = s.dataset.thumb || s.querySelector(&#39;img&#39;).src;
            const t = document.createElement(&#39;div&#39;);
            t.className = i === 0 ? &#39;g-thumb active&#39; : &#39;g-thumb&#39;;
            t.innerHTML = `&lt;img src=&#34;${thumbSrc}&#34; loading=&#34;lazy&#34;&gt;`;
            t.onclick = (e) =&gt; { e.stopPropagation(); switchTo(i); };
            thumbsContainer.appendChild(t);
        });
        const thumbs = thumbsContainer.querySelectorAll(&#39;.g-thumb&#39;);

        
        function safeScrollThumb(container, thumb) {
            if (!container || !thumb) return;
            
            
            const thumbTop = thumb.offsetTop;
            const thumbHeight = thumb.offsetHeight;
            const containerScrollTop = container.scrollTop;
            const containerHeight = container.clientHeight;

            
            if (thumbTop &lt; containerScrollTop) {
                
                container.scrollTop = thumbTop;
            } else if (thumbTop + thumbHeight &gt; containerScrollTop + containerHeight) {
                
                container.scrollTop = thumbTop + thumbHeight - containerHeight;
            }
        }

        function switchTo(index) {
            if (index &lt; 0) index = total - 1;
            if (index &gt;= total) index = 0;
            currentIndex = index;

            track.style.transform = `translateX(${-100 * index}%)`;
            const s = slides[index];
            
            const title = s.dataset.alt || &#34;&#34;;
            const desc = s.dataset.desc || &#34;&#34;;
            
            titleEl.textContent = title;
            descEl.textContent = desc;
            
            titleEl.parentElement.style.display = title ? &#39;block&#39; : &#39;none&#39;;
            if (desc) {
                infoCard.style.display = &#39;flex&#39;;
            } else {
                infoCard.style.display = &#39;none&#39;;
            }
            
            counterEl.textContent = `${index + 1} / ${total}`;

            thumbs.forEach(t =&gt; t.classList.remove(&#39;active&#39;));
            if (thumbs[index]) {
                thumbs[index].classList.add(&#39;active&#39;);
                safeScrollThumb(thumbsContainer, thumbs[index]);
            }

            if (lb.classList.contains(&#39;active&#39;)) {
                updateLightboxImage(index);
            }
        }

        function openLightbox() {
            updateLightboxImage(currentIndex);
            lb.classList.add(&#39;active&#39;);
            document.body.style.overflow = &#39;hidden&#39;; 
        }

        function closeLightbox() {
            lb.classList.remove(&#39;active&#39;);
            document.body.style.overflow = &#39;&#39;;
            setTimeout(resetZoom, 200);
        }

        function updateLightboxImage(index) {
            resetZoom(); 
            lbImg.style.opacity = 0.5;
            const s = slides[index];
            const targetLink = s.dataset.link || s.dataset.src;
            lbLinkBtn.href = targetLink;
            const tempImg = new Image();
            tempImg.src = s.dataset.src;
            tempImg.onload = () =&gt; {
                lbImg.src = s.dataset.src;
                lbImg.style.opacity = 1;
            };
            lbCounter.textContent = `${index + 1} / ${total}`;
        }

        function updateTransform() {
            lbImg.style.transform = `translate(${panX}px, ${panY}px) scale(${zoomLevel})`;
        }

        function resetZoom() {
            zoomLevel = 1; panX = 0; panY = 0;
            lbImg.style.transform = &#39;&#39;;
            lbImg.style.transition = &#39;transform 0.3s ease&#39;; 
        }

        lbImg.addEventListener(&#39;wheel&#39;, (e) =&gt; {
            e.preventDefault();
            const delta = e.deltaY * -0.01;
            zoomLevel = Math.min(Math.max(1, zoomLevel + delta), 5); 
            if (zoomLevel === 1) { panX = 0; panY = 0; }
            lbImg.style.transition = &#39;none&#39;; 
            updateTransform();
        });

        function onDragStart(e) {
            if (zoomLevel &lt;= 1) return; 
            e.preventDefault();
            isDragging = true; hasMoved = false; 
            startX = e.type.includes(&#39;mouse&#39;) ? e.pageX : e.touches[0].pageX;
            startY = e.type.includes(&#39;mouse&#39;) ? e.pageY : e.touches[0].pageY;
            initialPanX = panX; initialPanY = panY;
            lbImg.style.transition = &#39;none&#39;; 
        }

        function onDragMove(e) {
            if (!isDragging) return;
            e.preventDefault();
            const currentX = e.type.includes(&#39;mouse&#39;) ? e.pageX : e.touches[0].pageX;
            const currentY = e.type.includes(&#39;mouse&#39;) ? e.pageY : e.touches[0].pageY;
            const diffX = currentX - startX; const diffY = currentY - startY;
            if (Math.abs(diffX) &gt; 2 || Math.abs(diffY) &gt; 2) hasMoved = true;
            panX = initialPanX + diffX; panY = initialPanY + diffY;
            updateTransform();
        }

        function onDragEnd(e) {
            if (!isDragging) return;
            isDragging = false;
            lbImg.style.transition = &#39;transform 0.1s linear&#39;; 
        }

        lbImg.addEventListener(&#39;click&#39;, (e) =&gt; {
            e.stopPropagation();
            if (hasMoved) { hasMoved = false; return; }
            if (zoomLevel &gt; 1) { resetZoom(); } 
            else { zoomLevel = 2.5; lbImg.style.transition = &#39;transform 0.3s cubic-bezier(0.25, 0.8, 0.25, 1)&#39;; updateTransform(); }
        });

        lbImg.addEventListener(&#39;mousedown&#39;, onDragStart);
        lbImg.addEventListener(&#39;touchstart&#39;, onDragStart);
        window.addEventListener(&#39;mousemove&#39;, onDragMove);
        window.addEventListener(&#39;touchmove&#39;, onDragMove, { passive: false });
        window.addEventListener(&#39;mouseup&#39;, onDragEnd);
        window.addEventListener(&#39;touchend&#39;, onDragEnd);

        root.querySelector(&#39;.gallery-track&#39;).onclick = () =&gt; openLightbox();

        const bindNav = (btn, dir) =&gt; {
            btn.onclick = (e) =&gt; {
                e.preventDefault(); e.stopImmediatePropagation(); 
                switchTo(currentIndex + dir);
            };
        };

        bindNav(root.querySelector(&#39;.prev-btn&#39;), -1);
        bindNav(root.querySelector(&#39;.next-btn&#39;), 1);
        bindNav(lb.querySelector(&#39;.lb-prev&#39;), -1);
        bindNav(lb.querySelector(&#39;.lb-next&#39;), 1);

        lb.querySelector(&#39;.lb-close-btn&#39;).onclick = (e) =&gt; { e.stopPropagation(); closeLightbox(); };
        lbLinkBtn.onclick = (e) =&gt; { e.stopPropagation(); };

        lb.onclick = (e) =&gt; {
            if (e.target === lb || e.target.classList.contains(&#39;lb-canvas&#39;)) closeLightbox();
        };

        document.addEventListener(&#39;keydown&#39;, (e) =&gt; {
            if (!lb.classList.contains(&#39;active&#39;)) return;
            if (e.key === &#39;ArrowLeft&#39;) switchTo(currentIndex - 1);
            if (e.key === &#39;ArrowRight&#39;) switchTo(currentIndex + 1);
            if (e.key === &#39;Escape&#39;) closeLightbox();
        });

        
        switchTo(0);
    })();
&lt;/script&gt;
&lt;div class=&#34;hugo-gallery&#34; id=&#34;gallery-100&#34;&gt;
    &lt;div class=&#34;gallery-inline-layout&#34;&gt;
        
        &lt;div class=&#34;visual-column&#34;&gt;
            &lt;div class=&#34;gallery-viewport&#34;&gt;
                &lt;div class=&#34;gallery-track&#34;&gt;
                    
                        
                        
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20251019-image21.jpg&#34;
                                 data-src=&#34;20251019-image21.jpg&#34; 
                                 data-alt=&#34;谜&#34; 
                                 data-desc=&#34;谜&#34;
                                 data-link=&#34;http://www.cnu.cc/works/672946&#34;&gt;
                                &lt;img src=&#34;20251019-image21.jpg&#34; alt=&#34;谜&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20251019-image22.jpg&#34;
                                 data-src=&#34;20251019-image22.jpg&#34; 
                                 data-alt=&#34;谜&#34; 
                                 data-desc=&#34;谜&#34;
                                 data-link=&#34;http://www.cnu.cc/works/672946&#34;&gt;
                                &lt;img src=&#34;20251019-image22.jpg&#34; alt=&#34;谜&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20251019-image23.jpg&#34;
                                 data-src=&#34;20251019-image23.jpg&#34; 
                                 data-alt=&#34;谜&#34; 
                                 data-desc=&#34;谜&#34;
                                 data-link=&#34;http://www.cnu.cc/works/672946&#34;&gt;
                                &lt;img src=&#34;20251019-image23.jpg&#34; alt=&#34;谜&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20251019-image24.jpg&#34;
                                 data-src=&#34;20251019-image24.jpg&#34; 
                                 data-alt=&#34;谜&#34; 
                                 data-desc=&#34;谜&#34;
                                 data-link=&#34;http://www.cnu.cc/works/672946&#34;&gt;
                                &lt;img src=&#34;20251019-image24.jpg&#34; alt=&#34;谜&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20251019-image25.jpg&#34;
                                 data-src=&#34;20251019-image25.jpg&#34; 
                                 data-alt=&#34;谜&#34; 
                                 data-desc=&#34;谜&#34;
                                 data-link=&#34;http://www.cnu.cc/works/672946&#34;&gt;
                                &lt;img src=&#34;20251019-image25.jpg&#34; alt=&#34;谜&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20251019-image26.jpg&#34;
                                 data-src=&#34;20251019-image26.jpg&#34; 
                                 data-alt=&#34;谜&#34; 
                                 data-desc=&#34;谜&#34;
                                 data-link=&#34;http://www.cnu.cc/works/672946&#34;&gt;
                                &lt;img src=&#34;20251019-image26.jpg&#34; alt=&#34;谜&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20251019-image27.jpg&#34;
                                 data-src=&#34;20251019-image27.jpg&#34; 
                                 data-alt=&#34;谜&#34; 
                                 data-desc=&#34;谜&#34;
                                 data-link=&#34;http://www.cnu.cc/works/672946&#34;&gt;
                                &lt;img src=&#34;20251019-image27.jpg&#34; alt=&#34;谜&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20251019-image28.jpg&#34;
                                 data-src=&#34;20251019-image28.jpg&#34; 
                                 data-alt=&#34;谜&#34; 
                                 data-desc=&#34;谜&#34;
                                 data-link=&#34;http://www.cnu.cc/works/672946&#34;&gt;
                                &lt;img src=&#34;20251019-image28.jpg&#34; alt=&#34;谜&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20251019-image29.jpg&#34;
                                 data-src=&#34;20251019-image29.jpg&#34; 
                                 data-alt=&#34;谜&#34; 
                                 data-desc=&#34;谜&#34;
                                 data-link=&#34;http://www.cnu.cc/works/672946&#34;&gt;
                                &lt;img src=&#34;20251019-image29.jpg&#34; alt=&#34;谜&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20251019-image30.jpg&#34;
                                 data-src=&#34;20251019-image30.jpg&#34; 
                                 data-alt=&#34;谜&#34; 
                                 data-desc=&#34;谜&#34;
                                 data-link=&#34;http://www.cnu.cc/works/672946&#34;&gt;
                                &lt;img src=&#34;20251019-image30.jpg&#34; alt=&#34;谜&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20251019-image31.jpg&#34;
                                 data-src=&#34;20251019-image31.jpg&#34; 
                                 data-alt=&#34;谜&#34; 
                                 data-desc=&#34;谜&#34;
                                 data-link=&#34;http://www.cnu.cc/works/672946&#34;&gt;
                                &lt;img src=&#34;20251019-image31.jpg&#34; alt=&#34;谜&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20251019-image32.jpg&#34;
                                 data-src=&#34;20251019-image32.jpg&#34; 
                                 data-alt=&#34;谜&#34; 
                                 data-desc=&#34;谜&#34;
                                 data-link=&#34;http://www.cnu.cc/works/672946&#34;&gt;
                                &lt;img src=&#34;20251019-image32.jpg&#34; alt=&#34;谜&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                    
                &lt;/div&gt;
            &lt;/div&gt;

            &lt;button class=&#34;nav-btn prev-btn&#34; aria-label=&#34;Previous&#34;&gt;
                &lt;svg width=&#34;24&#34; height=&#34;24&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;polyline points=&#34;15 18 9 12 15 6&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
            &lt;button class=&#34;nav-btn next-btn&#34; aria-label=&#34;Next&#34;&gt;
                &lt;svg width=&#34;24&#34; height=&#34;24&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;polyline points=&#34;9 18 15 12 9 6&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
            
            &lt;div class=&#34;inline-counter&#34;&gt;1 / 1&lt;/div&gt;
        &lt;/div&gt;

        &lt;div class=&#34;info-column&#34;&gt;
            &lt;div class=&#34;info-content-top&#34;&gt;
                &lt;div class=&#34;info-header&#34;&gt;
                    &lt;h3 class=&#34;gallery-title&#34;&gt;&lt;/h3&gt;
                &lt;/div&gt;
                
                &lt;div class=&#34;info-card&#34;&gt;
                    &lt;div class=&#34;info-body&#34;&gt;
                        &lt;p class=&#34;gallery-desc&#34;&gt;&lt;/p&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
            &lt;/div&gt;

            &lt;div class=&#34;info-footer&#34;&gt;
                &lt;div class=&#34;gallery-thumbs&#34;&gt;&lt;/div&gt;
            &lt;/div&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;gallery-lightbox&#34;&gt;
        &lt;div class=&#34;lb-toolbar&#34;&gt;
            &lt;span class=&#34;lb-counter&#34;&gt;&lt;/span&gt;
            &lt;div class=&#34;lb-actions&#34;&gt;
                &lt;a class=&#34;lb-btn lb-link-btn&#34; href=&#34;#&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; title=&#34;打开链接/原图&#34;&gt;
                    &lt;svg width=&#34;20&#34; height=&#34;20&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
                &lt;/a&gt;
                &lt;button class=&#34;lb-btn lb-close-btn&#34; title=&#34;关闭&#34;&gt;
                    &lt;svg width=&#34;24&#34; height=&#34;24&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34;&gt;&lt;line x1=&#34;18&#34; y1=&#34;6&#34; x2=&#34;6&#34; y2=&#34;18&#34;&gt;&lt;/line&gt;&lt;line x1=&#34;6&#34; y1=&#34;6&#34; x2=&#34;18&#34; y2=&#34;18&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
                &lt;/button&gt;
            &lt;/div&gt;
        &lt;/div&gt;
        &lt;div class=&#34;lb-canvas&#34;&gt;
            &lt;button class=&#34;lb-nav lb-prev&#34;&gt;
                &lt;svg width=&#34;36&#34; height=&#34;36&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34;&gt;&lt;polyline points=&#34;15 18 9 12 15 6&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
            &lt;div class=&#34;lb-img-wrapper&#34;&gt;
                &lt;img class=&#34;lb-img&#34; src=&#34;&#34; alt=&#34;&#34;&gt;
            &lt;/div&gt;
            &lt;button class=&#34;lb-nav lb-next&#34;&gt;
                &lt;svg width=&#34;36&#34; height=&#34;36&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34;&gt;&lt;polyline points=&#34;9 18 15 12 9 6&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

&lt;style&gt;
     
    .hugo-gallery {
        --g-bg: #ffffff;
        --g-border: #e0e0e0;
        --g-visual-bg: #111;
        --g-text-main: inherit; 
        --g-text-sub: #555;
        --g-card-bg: #f7f9fc;
        --g-card-border: #3b82f6;
        --g-thumb-active: #3b82f6;

        position: relative;
        margin: 2em 0;
        background: var(--g-bg);
        border: 1px solid var(--g-border);
        font-family: inherit; 
        box-sizing: border-box;
    }
    .hugo-gallery * { box-sizing: border-box; }

     
    [data-scheme=&#34;dark&#34;] .hugo-gallery,
    html[data-theme=&#34;dark&#34;] .hugo-gallery,
    body.dark .hugo-gallery {
        --g-bg: #1e1e1e;
        --g-border: #333;
        --g-visual-bg: #000;
        --g-text-sub: #aaa;
        --g-card-bg: #252526;
        --g-card-border: #60a5fa;
        --g-thumb-active: #60a5fa;
    }
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .hugo-gallery {
            --g-bg: #1e1e1e;
            --g-border: #333;
            --g-visual-bg: #000;
            --g-text-sub: #aaa;
            --g-card-bg: #252526;
            --g-card-border: #60a5fa;
            --g-thumb-active: #60a5fa;
        }
    }

     
    .gallery-inline-layout {
        display: grid;
        grid-template-columns: 2fr 1.2fr; 
        height: 550px; 
    }

     
    .visual-column {
        position: relative;
        background: var(--g-visual-bg);
        overflow: hidden;
        display: flex; align-items: center; justify-content: center;
    }
    .gallery-viewport { width: 100%; height: 100%; cursor: zoom-in; }
    .gallery-track { display: flex; height: 100%; transition: transform 0.3s ease; }
    .gallery-slide { 
        flex: 0 0 100%; width: 100%; height: 100%; 
        display: flex; align-items: center; justify-content: center; 
    }
    .gallery-slide img { 
        max-width: 100%; max-height: 100%; 
        object-fit: contain; display: block; 
    }

    .nav-btn {
        position: absolute; top: 50%; transform: translateY(-50%);
        width: 40px; height: 40px;
        background: rgba(255,255,255,0.9);
        border: none; border-radius: 50%; 
        cursor: pointer; color: #000;
        display: flex; align-items: center; justify-content: center;
        opacity: 0; transition: opacity 0.2s; z-index: 10;
    }
    .visual-column:hover .nav-btn { opacity: 1; }
    .prev-btn { left: 15px; }
    .next-btn { right: 15px; }
    .inline-counter {
        position: absolute; top: 15px; right: 15px;
        background: rgba(0,0,0,0.6); color: #fff;
        padding: 4px 8px; border-radius: 4px;
        font-size: 0.85em; pointer-events: none;
    }

     
    .info-column {
        display: flex; flex-direction: column;
        padding: 25px;
        background: var(--g-bg);
        border-left: 1px solid var(--g-border);
        overflow: hidden; 
        color: var(--g-text-main);
        justify-content: flex-start; 
        height: 100%;  
    }
    
    .info-content-top {
         
        flex: 1; 
        display: flex; 
        flex-direction: column;
        min-height: 0;  
        overflow: hidden;  
    }

    .info-header { margin-bottom: 20px; flex-shrink: 0; }
    .gallery-title { margin: 0; line-height: 1.3; color: inherit; }

    .info-card {
         
        flex: 1;
        display: flex; flex-direction: column;
        margin-bottom: 20px; background: var(--g-card-bg);
        border-left: 4px solid var(--g-card-border);
        border-radius: 0 4px 4px 0;
        min-height: 0;  
    }
    .info-body {
         
        flex: 1;
        overflow-y: auto; 
        padding: 15px 20px; 
        scrollbar-width: thin;
    }
    .gallery-desc { 
        margin: 0; color: var(--g-text-sub); 
        line-height: 1.6; white-space: pre-wrap; 
    }
    
     
    .info-footer { 
        flex-shrink: 0; 
        margin-top: auto; 
        padding-top: 20px;
    }
    
    .gallery-thumbs { 
         
        position: relative;
        display: flex; gap: 10px; flex-wrap: wrap; 
        align-items: flex-start;
        max-height: 130px; 
        overflow-y: auto;
        scrollbar-width: thin;
    }
    .hugo-gallery .gallery-thumbs .g-thumb {
        width: 50px !important; height: 50px !important; 
        min-width: 50px !important; min-height: 50px !important;
        flex-shrink: 0; cursor: pointer; opacity: 0.6;
        border: 2px solid transparent; border-radius: 6px; 
        overflow: hidden; position: relative; background: #eee;
        padding: 0 !important; margin: 0 !important;
    }
    .hugo-gallery .gallery-thumbs .g-thumb img { 
        width: 100% !important; height: 100% !important; 
        object-fit: cover !important; display: block !important;
        margin: 0 !important; padding: 0 !important; max-width: none !important;
    }
    .hugo-gallery .gallery-thumbs .g-thumb:hover { opacity: 0.9; }
    .hugo-gallery .gallery-thumbs .g-thumb.active { 
        opacity: 1; border-color: var(--g-thumb-active); 
        box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.2);
    }

     
    @media (max-width: 768px) {
        .gallery-inline-layout { grid-template-columns: 1fr; grid-template-rows: 60vw auto; height: auto; }
        .visual-column { height: 100%; min-height: 250px; }
        .info-column { border-left: none; border-top: 1px solid var(--g-border); height: 400px; padding: 20px; }
        .info-card { background: transparent; border-left: none; padding-left: 0; }
        .info-body { padding: 0; }
        .info-footer { margin-top: auto; }
    }

     
    .gallery-lightbox {
        position: fixed; inset: 0; z-index: 99999;
        background: #000; display: none; flex-direction: column;
        opacity: 0; transition: opacity 0.2s; user-select: none;
    }
    .gallery-lightbox.active { display: flex; opacity: 1; }
    .lb-toolbar {
        position: absolute; top: 0; left: 0; width: 100%; height: 60px;
        display: flex; justify-content: space-between; align-items: center;
        padding: 0 20px; z-index: 20; background: rgba(0,0,0,0.6);
    }
    .lb-counter { color: #ccc; font-size: 0.9em; }
    .lb-actions { display: flex; gap: 15px; }
    .lb-btn { background: transparent; border: none; color: #ddd; cursor: pointer; display: flex; align-items: center; }
    .lb-btn:hover { color: #fff; }
    .lb-canvas {
        flex: 1; width: 100%; height: 100%; position: relative; overflow: hidden;
        display: flex; align-items: center; justify-content: center;
    }
    .lb-img-wrapper { width: 100%; height: 100%; display: flex; align-items: center; justify-content: center; }
    .lb-img { max-width: 100%; max-height: 100%; object-fit: contain; transform-origin: center; will-change: transform; }
    .lb-nav {
        position: absolute; top: 50%; transform: translateY(-50%);
        background: transparent; border: none; color: rgba(255,255,255,0.5);
        padding: 20px; cursor: pointer; z-index: 10;
    }
    .lb-nav:hover { color: #fff; }
    .lb-prev { left: 10px; } .lb-next { right: 10px; }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const galleryId = &#34;gallery-100&#34;;
        const root = document.getElementById(galleryId);
        if (!root) return;

        const track = root.querySelector(&#39;.gallery-track&#39;);
        const slides = Array.from(track.querySelectorAll(&#39;.gallery-slide&#39;));
        if (slides.length === 0) return;

        const titleEl = root.querySelector(&#39;.gallery-title&#39;);
        const descEl = root.querySelector(&#39;.gallery-desc&#39;);
        const counterEl = root.querySelector(&#39;.inline-counter&#39;);
        const thumbsContainer = root.querySelector(&#39;.gallery-thumbs&#39;);
        const infoCard = root.querySelector(&#39;.info-card&#39;);

        const lb = root.querySelector(&#39;.gallery-lightbox&#39;);
        const lbImg = lb.querySelector(&#39;.lb-img&#39;);
        const lbCounter = lb.querySelector(&#39;.lb-counter&#39;);
        const lbLinkBtn = lb.querySelector(&#39;.lb-link-btn&#39;); 
        
        let currentIndex = 0;
        const total = slides.length;
        
        let zoomLevel = 1; let panX = 0, panY = 0; 
        let startX = 0, startY = 0; let initialPanX = 0, initialPanY = 0; 
        let isDragging = false; let hasMoved = false; 
        
        slides.forEach((s, i) =&gt; {
            const thumbSrc = s.dataset.thumb || s.querySelector(&#39;img&#39;).src;
            const t = document.createElement(&#39;div&#39;);
            t.className = i === 0 ? &#39;g-thumb active&#39; : &#39;g-thumb&#39;;
            t.innerHTML = `&lt;img src=&#34;${thumbSrc}&#34; loading=&#34;lazy&#34;&gt;`;
            t.onclick = (e) =&gt; { e.stopPropagation(); switchTo(i); };
            thumbsContainer.appendChild(t);
        });
        const thumbs = thumbsContainer.querySelectorAll(&#39;.g-thumb&#39;);

        
        function safeScrollThumb(container, thumb) {
            if (!container || !thumb) return;
            
            
            const thumbTop = thumb.offsetTop;
            const thumbHeight = thumb.offsetHeight;
            const containerScrollTop = container.scrollTop;
            const containerHeight = container.clientHeight;

            
            if (thumbTop &lt; containerScrollTop) {
                
                container.scrollTop = thumbTop;
            } else if (thumbTop + thumbHeight &gt; containerScrollTop + containerHeight) {
                
                container.scrollTop = thumbTop + thumbHeight - containerHeight;
            }
        }

        function switchTo(index) {
            if (index &lt; 0) index = total - 1;
            if (index &gt;= total) index = 0;
            currentIndex = index;

            track.style.transform = `translateX(${-100 * index}%)`;
            const s = slides[index];
            
            const title = s.dataset.alt || &#34;&#34;;
            const desc = s.dataset.desc || &#34;&#34;;
            
            titleEl.textContent = title;
            descEl.textContent = desc;
            
            titleEl.parentElement.style.display = title ? &#39;block&#39; : &#39;none&#39;;
            if (desc) {
                infoCard.style.display = &#39;flex&#39;;
            } else {
                infoCard.style.display = &#39;none&#39;;
            }
            
            counterEl.textContent = `${index + 1} / ${total}`;

            thumbs.forEach(t =&gt; t.classList.remove(&#39;active&#39;));
            if (thumbs[index]) {
                thumbs[index].classList.add(&#39;active&#39;);
                safeScrollThumb(thumbsContainer, thumbs[index]);
            }

            if (lb.classList.contains(&#39;active&#39;)) {
                updateLightboxImage(index);
            }
        }

        function openLightbox() {
            updateLightboxImage(currentIndex);
            lb.classList.add(&#39;active&#39;);
            document.body.style.overflow = &#39;hidden&#39;; 
        }

        function closeLightbox() {
            lb.classList.remove(&#39;active&#39;);
            document.body.style.overflow = &#39;&#39;;
            setTimeout(resetZoom, 200);
        }

        function updateLightboxImage(index) {
            resetZoom(); 
            lbImg.style.opacity = 0.5;
            const s = slides[index];
            const targetLink = s.dataset.link || s.dataset.src;
            lbLinkBtn.href = targetLink;
            const tempImg = new Image();
            tempImg.src = s.dataset.src;
            tempImg.onload = () =&gt; {
                lbImg.src = s.dataset.src;
                lbImg.style.opacity = 1;
            };
            lbCounter.textContent = `${index + 1} / ${total}`;
        }

        function updateTransform() {
            lbImg.style.transform = `translate(${panX}px, ${panY}px) scale(${zoomLevel})`;
        }

        function resetZoom() {
            zoomLevel = 1; panX = 0; panY = 0;
            lbImg.style.transform = &#39;&#39;;
            lbImg.style.transition = &#39;transform 0.3s ease&#39;; 
        }

        lbImg.addEventListener(&#39;wheel&#39;, (e) =&gt; {
            e.preventDefault();
            const delta = e.deltaY * -0.01;
            zoomLevel = Math.min(Math.max(1, zoomLevel + delta), 5); 
            if (zoomLevel === 1) { panX = 0; panY = 0; }
            lbImg.style.transition = &#39;none&#39;; 
            updateTransform();
        });

        function onDragStart(e) {
            if (zoomLevel &lt;= 1) return; 
            e.preventDefault();
            isDragging = true; hasMoved = false; 
            startX = e.type.includes(&#39;mouse&#39;) ? e.pageX : e.touches[0].pageX;
            startY = e.type.includes(&#39;mouse&#39;) ? e.pageY : e.touches[0].pageY;
            initialPanX = panX; initialPanY = panY;
            lbImg.style.transition = &#39;none&#39;; 
        }

        function onDragMove(e) {
            if (!isDragging) return;
            e.preventDefault();
            const currentX = e.type.includes(&#39;mouse&#39;) ? e.pageX : e.touches[0].pageX;
            const currentY = e.type.includes(&#39;mouse&#39;) ? e.pageY : e.touches[0].pageY;
            const diffX = currentX - startX; const diffY = currentY - startY;
            if (Math.abs(diffX) &gt; 2 || Math.abs(diffY) &gt; 2) hasMoved = true;
            panX = initialPanX + diffX; panY = initialPanY + diffY;
            updateTransform();
        }

        function onDragEnd(e) {
            if (!isDragging) return;
            isDragging = false;
            lbImg.style.transition = &#39;transform 0.1s linear&#39;; 
        }

        lbImg.addEventListener(&#39;click&#39;, (e) =&gt; {
            e.stopPropagation();
            if (hasMoved) { hasMoved = false; return; }
            if (zoomLevel &gt; 1) { resetZoom(); } 
            else { zoomLevel = 2.5; lbImg.style.transition = &#39;transform 0.3s cubic-bezier(0.25, 0.8, 0.25, 1)&#39;; updateTransform(); }
        });

        lbImg.addEventListener(&#39;mousedown&#39;, onDragStart);
        lbImg.addEventListener(&#39;touchstart&#39;, onDragStart);
        window.addEventListener(&#39;mousemove&#39;, onDragMove);
        window.addEventListener(&#39;touchmove&#39;, onDragMove, { passive: false });
        window.addEventListener(&#39;mouseup&#39;, onDragEnd);
        window.addEventListener(&#39;touchend&#39;, onDragEnd);

        root.querySelector(&#39;.gallery-track&#39;).onclick = () =&gt; openLightbox();

        const bindNav = (btn, dir) =&gt; {
            btn.onclick = (e) =&gt; {
                e.preventDefault(); e.stopImmediatePropagation(); 
                switchTo(currentIndex + dir);
            };
        };

        bindNav(root.querySelector(&#39;.prev-btn&#39;), -1);
        bindNav(root.querySelector(&#39;.next-btn&#39;), 1);
        bindNav(lb.querySelector(&#39;.lb-prev&#39;), -1);
        bindNav(lb.querySelector(&#39;.lb-next&#39;), 1);

        lb.querySelector(&#39;.lb-close-btn&#39;).onclick = (e) =&gt; { e.stopPropagation(); closeLightbox(); };
        lbLinkBtn.onclick = (e) =&gt; { e.stopPropagation(); };

        lb.onclick = (e) =&gt; {
            if (e.target === lb || e.target.classList.contains(&#39;lb-canvas&#39;)) closeLightbox();
        };

        document.addEventListener(&#39;keydown&#39;, (e) =&gt; {
            if (!lb.classList.contains(&#39;active&#39;)) return;
            if (e.key === &#39;ArrowLeft&#39;) switchTo(currentIndex - 1);
            if (e.key === &#39;ArrowRight&#39;) switchTo(currentIndex + 1);
            if (e.key === &#39;Escape&#39;) closeLightbox();
        });

        
        switchTo(0);
    })();
&lt;/script&gt;
&lt;div class=&#34;hugo-gallery&#34; id=&#34;gallery-101&#34;&gt;
    &lt;div class=&#34;gallery-inline-layout&#34;&gt;
        
        &lt;div class=&#34;visual-column&#34;&gt;
            &lt;div class=&#34;gallery-viewport&#34;&gt;
                &lt;div class=&#34;gallery-track&#34;&gt;
                    
                        
                        
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20251019-image33.jpg&#34;
                                 data-src=&#34;20251019-image33.jpg&#34; 
                                 data-alt=&#34;欣子&#34; 
                                 data-desc=&#34;欣子&#34;
                                 data-link=&#34;http://www.cnu.cc/works/672925&#34;&gt;
                                &lt;img src=&#34;20251019-image33.jpg&#34; alt=&#34;欣子&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20251019-image34.jpg&#34;
                                 data-src=&#34;20251019-image34.jpg&#34; 
                                 data-alt=&#34;欣子&#34; 
                                 data-desc=&#34;欣子&#34;
                                 data-link=&#34;http://www.cnu.cc/works/672925&#34;&gt;
                                &lt;img src=&#34;20251019-image34.jpg&#34; alt=&#34;欣子&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20251019-image35.jpg&#34;
                                 data-src=&#34;20251019-image35.jpg&#34; 
                                 data-alt=&#34;欣子&#34; 
                                 data-desc=&#34;欣子&#34;
                                 data-link=&#34;http://www.cnu.cc/works/672925&#34;&gt;
                                &lt;img src=&#34;20251019-image35.jpg&#34; alt=&#34;欣子&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20251019-image36.jpg&#34;
                                 data-src=&#34;20251019-image36.jpg&#34; 
                                 data-alt=&#34;欣子&#34; 
                                 data-desc=&#34;欣子&#34;
                                 data-link=&#34;http://www.cnu.cc/works/672925&#34;&gt;
                                &lt;img src=&#34;20251019-image36.jpg&#34; alt=&#34;欣子&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20251019-image37.jpg&#34;
                                 data-src=&#34;20251019-image37.jpg&#34; 
                                 data-alt=&#34;欣子&#34; 
                                 data-desc=&#34;欣子&#34;
                                 data-link=&#34;http://www.cnu.cc/works/672925&#34;&gt;
                                &lt;img src=&#34;20251019-image37.jpg&#34; alt=&#34;欣子&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20251019-image38.jpg&#34;
                                 data-src=&#34;20251019-image38.jpg&#34; 
                                 data-alt=&#34;欣子&#34; 
                                 data-desc=&#34;欣子&#34;
                                 data-link=&#34;http://www.cnu.cc/works/672925&#34;&gt;
                                &lt;img src=&#34;20251019-image38.jpg&#34; alt=&#34;欣子&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20251019-image39.jpg&#34;
                                 data-src=&#34;20251019-image39.jpg&#34; 
                                 data-alt=&#34;欣子&#34; 
                                 data-desc=&#34;欣子&#34;
                                 data-link=&#34;http://www.cnu.cc/works/672925&#34;&gt;
                                &lt;img src=&#34;20251019-image39.jpg&#34; alt=&#34;欣子&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20251019-image40.jpg&#34;
                                 data-src=&#34;20251019-image40.jpg&#34; 
                                 data-alt=&#34;欣子&#34; 
                                 data-desc=&#34;欣子&#34;
                                 data-link=&#34;http://www.cnu.cc/works/672925&#34;&gt;
                                &lt;img src=&#34;20251019-image40.jpg&#34; alt=&#34;欣子&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20251019-image41.jpg&#34;
                                 data-src=&#34;20251019-image41.jpg&#34; 
                                 data-alt=&#34;欣子&#34; 
                                 data-desc=&#34;欣子&#34;
                                 data-link=&#34;http://www.cnu.cc/works/672925&#34;&gt;
                                &lt;img src=&#34;20251019-image41.jpg&#34; alt=&#34;欣子&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20251019-image42.jpg&#34;
                                 data-src=&#34;20251019-image42.jpg&#34; 
                                 data-alt=&#34;欣子&#34; 
                                 data-desc=&#34;欣子&#34;
                                 data-link=&#34;http://www.cnu.cc/works/672925&#34;&gt;
                                &lt;img src=&#34;20251019-image42.jpg&#34; alt=&#34;欣子&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20251019-image43.jpg&#34;
                                 data-src=&#34;20251019-image43.jpg&#34; 
                                 data-alt=&#34;欣子&#34; 
                                 data-desc=&#34;欣子&#34;
                                 data-link=&#34;http://www.cnu.cc/works/672925&#34;&gt;
                                &lt;img src=&#34;20251019-image43.jpg&#34; alt=&#34;欣子&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20251019-image44.jpg&#34;
                                 data-src=&#34;20251019-image44.jpg&#34; 
                                 data-alt=&#34;欣子&#34; 
                                 data-desc=&#34;欣子&#34;
                                 data-link=&#34;http://www.cnu.cc/works/672925&#34;&gt;
                                &lt;img src=&#34;20251019-image44.jpg&#34; alt=&#34;欣子&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20251019-image45.jpg&#34;
                                 data-src=&#34;20251019-image45.jpg&#34; 
                                 data-alt=&#34;欣子&#34; 
                                 data-desc=&#34;欣子&#34;
                                 data-link=&#34;http://www.cnu.cc/works/672925&#34;&gt;
                                &lt;img src=&#34;20251019-image45.jpg&#34; alt=&#34;欣子&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20251019-image46.jpg&#34;
                                 data-src=&#34;20251019-image46.jpg&#34; 
                                 data-alt=&#34;欣子&#34; 
                                 data-desc=&#34;欣子&#34;
                                 data-link=&#34;http://www.cnu.cc/works/672925&#34;&gt;
                                &lt;img src=&#34;20251019-image46.jpg&#34; alt=&#34;欣子&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20251019-image47.jpg&#34;
                                 data-src=&#34;20251019-image47.jpg&#34; 
                                 data-alt=&#34;欣子&#34; 
                                 data-desc=&#34;欣子&#34;
                                 data-link=&#34;http://www.cnu.cc/works/672925&#34;&gt;
                                &lt;img src=&#34;20251019-image47.jpg&#34; alt=&#34;欣子&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                    
                &lt;/div&gt;
            &lt;/div&gt;

            &lt;button class=&#34;nav-btn prev-btn&#34; aria-label=&#34;Previous&#34;&gt;
                &lt;svg width=&#34;24&#34; height=&#34;24&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;polyline points=&#34;15 18 9 12 15 6&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
            &lt;button class=&#34;nav-btn next-btn&#34; aria-label=&#34;Next&#34;&gt;
                &lt;svg width=&#34;24&#34; height=&#34;24&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;polyline points=&#34;9 18 15 12 9 6&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
            
            &lt;div class=&#34;inline-counter&#34;&gt;1 / 1&lt;/div&gt;
        &lt;/div&gt;

        &lt;div class=&#34;info-column&#34;&gt;
            &lt;div class=&#34;info-content-top&#34;&gt;
                &lt;div class=&#34;info-header&#34;&gt;
                    &lt;h3 class=&#34;gallery-title&#34;&gt;&lt;/h3&gt;
                &lt;/div&gt;
                
                &lt;div class=&#34;info-card&#34;&gt;
                    &lt;div class=&#34;info-body&#34;&gt;
                        &lt;p class=&#34;gallery-desc&#34;&gt;&lt;/p&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
            &lt;/div&gt;

            &lt;div class=&#34;info-footer&#34;&gt;
                &lt;div class=&#34;gallery-thumbs&#34;&gt;&lt;/div&gt;
            &lt;/div&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;gallery-lightbox&#34;&gt;
        &lt;div class=&#34;lb-toolbar&#34;&gt;
            &lt;span class=&#34;lb-counter&#34;&gt;&lt;/span&gt;
            &lt;div class=&#34;lb-actions&#34;&gt;
                &lt;a class=&#34;lb-btn lb-link-btn&#34; href=&#34;#&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; title=&#34;打开链接/原图&#34;&gt;
                    &lt;svg width=&#34;20&#34; height=&#34;20&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
                &lt;/a&gt;
                &lt;button class=&#34;lb-btn lb-close-btn&#34; title=&#34;关闭&#34;&gt;
                    &lt;svg width=&#34;24&#34; height=&#34;24&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34;&gt;&lt;line x1=&#34;18&#34; y1=&#34;6&#34; x2=&#34;6&#34; y2=&#34;18&#34;&gt;&lt;/line&gt;&lt;line x1=&#34;6&#34; y1=&#34;6&#34; x2=&#34;18&#34; y2=&#34;18&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
                &lt;/button&gt;
            &lt;/div&gt;
        &lt;/div&gt;
        &lt;div class=&#34;lb-canvas&#34;&gt;
            &lt;button class=&#34;lb-nav lb-prev&#34;&gt;
                &lt;svg width=&#34;36&#34; height=&#34;36&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34;&gt;&lt;polyline points=&#34;15 18 9 12 15 6&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
            &lt;div class=&#34;lb-img-wrapper&#34;&gt;
                &lt;img class=&#34;lb-img&#34; src=&#34;&#34; alt=&#34;&#34;&gt;
            &lt;/div&gt;
            &lt;button class=&#34;lb-nav lb-next&#34;&gt;
                &lt;svg width=&#34;36&#34; height=&#34;36&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34;&gt;&lt;polyline points=&#34;9 18 15 12 9 6&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

&lt;style&gt;
     
    .hugo-gallery {
        --g-bg: #ffffff;
        --g-border: #e0e0e0;
        --g-visual-bg: #111;
        --g-text-main: inherit; 
        --g-text-sub: #555;
        --g-card-bg: #f7f9fc;
        --g-card-border: #3b82f6;
        --g-thumb-active: #3b82f6;

        position: relative;
        margin: 2em 0;
        background: var(--g-bg);
        border: 1px solid var(--g-border);
        font-family: inherit; 
        box-sizing: border-box;
    }
    .hugo-gallery * { box-sizing: border-box; }

     
    [data-scheme=&#34;dark&#34;] .hugo-gallery,
    html[data-theme=&#34;dark&#34;] .hugo-gallery,
    body.dark .hugo-gallery {
        --g-bg: #1e1e1e;
        --g-border: #333;
        --g-visual-bg: #000;
        --g-text-sub: #aaa;
        --g-card-bg: #252526;
        --g-card-border: #60a5fa;
        --g-thumb-active: #60a5fa;
    }
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .hugo-gallery {
            --g-bg: #1e1e1e;
            --g-border: #333;
            --g-visual-bg: #000;
            --g-text-sub: #aaa;
            --g-card-bg: #252526;
            --g-card-border: #60a5fa;
            --g-thumb-active: #60a5fa;
        }
    }

     
    .gallery-inline-layout {
        display: grid;
        grid-template-columns: 2fr 1.2fr; 
        height: 550px; 
    }

     
    .visual-column {
        position: relative;
        background: var(--g-visual-bg);
        overflow: hidden;
        display: flex; align-items: center; justify-content: center;
    }
    .gallery-viewport { width: 100%; height: 100%; cursor: zoom-in; }
    .gallery-track { display: flex; height: 100%; transition: transform 0.3s ease; }
    .gallery-slide { 
        flex: 0 0 100%; width: 100%; height: 100%; 
        display: flex; align-items: center; justify-content: center; 
    }
    .gallery-slide img { 
        max-width: 100%; max-height: 100%; 
        object-fit: contain; display: block; 
    }

    .nav-btn {
        position: absolute; top: 50%; transform: translateY(-50%);
        width: 40px; height: 40px;
        background: rgba(255,255,255,0.9);
        border: none; border-radius: 50%; 
        cursor: pointer; color: #000;
        display: flex; align-items: center; justify-content: center;
        opacity: 0; transition: opacity 0.2s; z-index: 10;
    }
    .visual-column:hover .nav-btn { opacity: 1; }
    .prev-btn { left: 15px; }
    .next-btn { right: 15px; }
    .inline-counter {
        position: absolute; top: 15px; right: 15px;
        background: rgba(0,0,0,0.6); color: #fff;
        padding: 4px 8px; border-radius: 4px;
        font-size: 0.85em; pointer-events: none;
    }

     
    .info-column {
        display: flex; flex-direction: column;
        padding: 25px;
        background: var(--g-bg);
        border-left: 1px solid var(--g-border);
        overflow: hidden; 
        color: var(--g-text-main);
        justify-content: flex-start; 
        height: 100%;  
    }
    
    .info-content-top {
         
        flex: 1; 
        display: flex; 
        flex-direction: column;
        min-height: 0;  
        overflow: hidden;  
    }

    .info-header { margin-bottom: 20px; flex-shrink: 0; }
    .gallery-title { margin: 0; line-height: 1.3; color: inherit; }

    .info-card {
         
        flex: 1;
        display: flex; flex-direction: column;
        margin-bottom: 20px; background: var(--g-card-bg);
        border-left: 4px solid var(--g-card-border);
        border-radius: 0 4px 4px 0;
        min-height: 0;  
    }
    .info-body {
         
        flex: 1;
        overflow-y: auto; 
        padding: 15px 20px; 
        scrollbar-width: thin;
    }
    .gallery-desc { 
        margin: 0; color: var(--g-text-sub); 
        line-height: 1.6; white-space: pre-wrap; 
    }
    
     
    .info-footer { 
        flex-shrink: 0; 
        margin-top: auto; 
        padding-top: 20px;
    }
    
    .gallery-thumbs { 
         
        position: relative;
        display: flex; gap: 10px; flex-wrap: wrap; 
        align-items: flex-start;
        max-height: 130px; 
        overflow-y: auto;
        scrollbar-width: thin;
    }
    .hugo-gallery .gallery-thumbs .g-thumb {
        width: 50px !important; height: 50px !important; 
        min-width: 50px !important; min-height: 50px !important;
        flex-shrink: 0; cursor: pointer; opacity: 0.6;
        border: 2px solid transparent; border-radius: 6px; 
        overflow: hidden; position: relative; background: #eee;
        padding: 0 !important; margin: 0 !important;
    }
    .hugo-gallery .gallery-thumbs .g-thumb img { 
        width: 100% !important; height: 100% !important; 
        object-fit: cover !important; display: block !important;
        margin: 0 !important; padding: 0 !important; max-width: none !important;
    }
    .hugo-gallery .gallery-thumbs .g-thumb:hover { opacity: 0.9; }
    .hugo-gallery .gallery-thumbs .g-thumb.active { 
        opacity: 1; border-color: var(--g-thumb-active); 
        box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.2);
    }

     
    @media (max-width: 768px) {
        .gallery-inline-layout { grid-template-columns: 1fr; grid-template-rows: 60vw auto; height: auto; }
        .visual-column { height: 100%; min-height: 250px; }
        .info-column { border-left: none; border-top: 1px solid var(--g-border); height: 400px; padding: 20px; }
        .info-card { background: transparent; border-left: none; padding-left: 0; }
        .info-body { padding: 0; }
        .info-footer { margin-top: auto; }
    }

     
    .gallery-lightbox {
        position: fixed; inset: 0; z-index: 99999;
        background: #000; display: none; flex-direction: column;
        opacity: 0; transition: opacity 0.2s; user-select: none;
    }
    .gallery-lightbox.active { display: flex; opacity: 1; }
    .lb-toolbar {
        position: absolute; top: 0; left: 0; width: 100%; height: 60px;
        display: flex; justify-content: space-between; align-items: center;
        padding: 0 20px; z-index: 20; background: rgba(0,0,0,0.6);
    }
    .lb-counter { color: #ccc; font-size: 0.9em; }
    .lb-actions { display: flex; gap: 15px; }
    .lb-btn { background: transparent; border: none; color: #ddd; cursor: pointer; display: flex; align-items: center; }
    .lb-btn:hover { color: #fff; }
    .lb-canvas {
        flex: 1; width: 100%; height: 100%; position: relative; overflow: hidden;
        display: flex; align-items: center; justify-content: center;
    }
    .lb-img-wrapper { width: 100%; height: 100%; display: flex; align-items: center; justify-content: center; }
    .lb-img { max-width: 100%; max-height: 100%; object-fit: contain; transform-origin: center; will-change: transform; }
    .lb-nav {
        position: absolute; top: 50%; transform: translateY(-50%);
        background: transparent; border: none; color: rgba(255,255,255,0.5);
        padding: 20px; cursor: pointer; z-index: 10;
    }
    .lb-nav:hover { color: #fff; }
    .lb-prev { left: 10px; } .lb-next { right: 10px; }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const galleryId = &#34;gallery-101&#34;;
        const root = document.getElementById(galleryId);
        if (!root) return;

        const track = root.querySelector(&#39;.gallery-track&#39;);
        const slides = Array.from(track.querySelectorAll(&#39;.gallery-slide&#39;));
        if (slides.length === 0) return;

        const titleEl = root.querySelector(&#39;.gallery-title&#39;);
        const descEl = root.querySelector(&#39;.gallery-desc&#39;);
        const counterEl = root.querySelector(&#39;.inline-counter&#39;);
        const thumbsContainer = root.querySelector(&#39;.gallery-thumbs&#39;);
        const infoCard = root.querySelector(&#39;.info-card&#39;);

        const lb = root.querySelector(&#39;.gallery-lightbox&#39;);
        const lbImg = lb.querySelector(&#39;.lb-img&#39;);
        const lbCounter = lb.querySelector(&#39;.lb-counter&#39;);
        const lbLinkBtn = lb.querySelector(&#39;.lb-link-btn&#39;); 
        
        let currentIndex = 0;
        const total = slides.length;
        
        let zoomLevel = 1; let panX = 0, panY = 0; 
        let startX = 0, startY = 0; let initialPanX = 0, initialPanY = 0; 
        let isDragging = false; let hasMoved = false; 
        
        slides.forEach((s, i) =&gt; {
            const thumbSrc = s.dataset.thumb || s.querySelector(&#39;img&#39;).src;
            const t = document.createElement(&#39;div&#39;);
            t.className = i === 0 ? &#39;g-thumb active&#39; : &#39;g-thumb&#39;;
            t.innerHTML = `&lt;img src=&#34;${thumbSrc}&#34; loading=&#34;lazy&#34;&gt;`;
            t.onclick = (e) =&gt; { e.stopPropagation(); switchTo(i); };
            thumbsContainer.appendChild(t);
        });
        const thumbs = thumbsContainer.querySelectorAll(&#39;.g-thumb&#39;);

        
        function safeScrollThumb(container, thumb) {
            if (!container || !thumb) return;
            
            
            const thumbTop = thumb.offsetTop;
            const thumbHeight = thumb.offsetHeight;
            const containerScrollTop = container.scrollTop;
            const containerHeight = container.clientHeight;

            
            if (thumbTop &lt; containerScrollTop) {
                
                container.scrollTop = thumbTop;
            } else if (thumbTop + thumbHeight &gt; containerScrollTop + containerHeight) {
                
                container.scrollTop = thumbTop + thumbHeight - containerHeight;
            }
        }

        function switchTo(index) {
            if (index &lt; 0) index = total - 1;
            if (index &gt;= total) index = 0;
            currentIndex = index;

            track.style.transform = `translateX(${-100 * index}%)`;
            const s = slides[index];
            
            const title = s.dataset.alt || &#34;&#34;;
            const desc = s.dataset.desc || &#34;&#34;;
            
            titleEl.textContent = title;
            descEl.textContent = desc;
            
            titleEl.parentElement.style.display = title ? &#39;block&#39; : &#39;none&#39;;
            if (desc) {
                infoCard.style.display = &#39;flex&#39;;
            } else {
                infoCard.style.display = &#39;none&#39;;
            }
            
            counterEl.textContent = `${index + 1} / ${total}`;

            thumbs.forEach(t =&gt; t.classList.remove(&#39;active&#39;));
            if (thumbs[index]) {
                thumbs[index].classList.add(&#39;active&#39;);
                safeScrollThumb(thumbsContainer, thumbs[index]);
            }

            if (lb.classList.contains(&#39;active&#39;)) {
                updateLightboxImage(index);
            }
        }

        function openLightbox() {
            updateLightboxImage(currentIndex);
            lb.classList.add(&#39;active&#39;);
            document.body.style.overflow = &#39;hidden&#39;; 
        }

        function closeLightbox() {
            lb.classList.remove(&#39;active&#39;);
            document.body.style.overflow = &#39;&#39;;
            setTimeout(resetZoom, 200);
        }

        function updateLightboxImage(index) {
            resetZoom(); 
            lbImg.style.opacity = 0.5;
            const s = slides[index];
            const targetLink = s.dataset.link || s.dataset.src;
            lbLinkBtn.href = targetLink;
            const tempImg = new Image();
            tempImg.src = s.dataset.src;
            tempImg.onload = () =&gt; {
                lbImg.src = s.dataset.src;
                lbImg.style.opacity = 1;
            };
            lbCounter.textContent = `${index + 1} / ${total}`;
        }

        function updateTransform() {
            lbImg.style.transform = `translate(${panX}px, ${panY}px) scale(${zoomLevel})`;
        }

        function resetZoom() {
            zoomLevel = 1; panX = 0; panY = 0;
            lbImg.style.transform = &#39;&#39;;
            lbImg.style.transition = &#39;transform 0.3s ease&#39;; 
        }

        lbImg.addEventListener(&#39;wheel&#39;, (e) =&gt; {
            e.preventDefault();
            const delta = e.deltaY * -0.01;
            zoomLevel = Math.min(Math.max(1, zoomLevel + delta), 5); 
            if (zoomLevel === 1) { panX = 0; panY = 0; }
            lbImg.style.transition = &#39;none&#39;; 
            updateTransform();
        });

        function onDragStart(e) {
            if (zoomLevel &lt;= 1) return; 
            e.preventDefault();
            isDragging = true; hasMoved = false; 
            startX = e.type.includes(&#39;mouse&#39;) ? e.pageX : e.touches[0].pageX;
            startY = e.type.includes(&#39;mouse&#39;) ? e.pageY : e.touches[0].pageY;
            initialPanX = panX; initialPanY = panY;
            lbImg.style.transition = &#39;none&#39;; 
        }

        function onDragMove(e) {
            if (!isDragging) return;
            e.preventDefault();
            const currentX = e.type.includes(&#39;mouse&#39;) ? e.pageX : e.touches[0].pageX;
            const currentY = e.type.includes(&#39;mouse&#39;) ? e.pageY : e.touches[0].pageY;
            const diffX = currentX - startX; const diffY = currentY - startY;
            if (Math.abs(diffX) &gt; 2 || Math.abs(diffY) &gt; 2) hasMoved = true;
            panX = initialPanX + diffX; panY = initialPanY + diffY;
            updateTransform();
        }

        function onDragEnd(e) {
            if (!isDragging) return;
            isDragging = false;
            lbImg.style.transition = &#39;transform 0.1s linear&#39;; 
        }

        lbImg.addEventListener(&#39;click&#39;, (e) =&gt; {
            e.stopPropagation();
            if (hasMoved) { hasMoved = false; return; }
            if (zoomLevel &gt; 1) { resetZoom(); } 
            else { zoomLevel = 2.5; lbImg.style.transition = &#39;transform 0.3s cubic-bezier(0.25, 0.8, 0.25, 1)&#39;; updateTransform(); }
        });

        lbImg.addEventListener(&#39;mousedown&#39;, onDragStart);
        lbImg.addEventListener(&#39;touchstart&#39;, onDragStart);
        window.addEventListener(&#39;mousemove&#39;, onDragMove);
        window.addEventListener(&#39;touchmove&#39;, onDragMove, { passive: false });
        window.addEventListener(&#39;mouseup&#39;, onDragEnd);
        window.addEventListener(&#39;touchend&#39;, onDragEnd);

        root.querySelector(&#39;.gallery-track&#39;).onclick = () =&gt; openLightbox();

        const bindNav = (btn, dir) =&gt; {
            btn.onclick = (e) =&gt; {
                e.preventDefault(); e.stopImmediatePropagation(); 
                switchTo(currentIndex + dir);
            };
        };

        bindNav(root.querySelector(&#39;.prev-btn&#39;), -1);
        bindNav(root.querySelector(&#39;.next-btn&#39;), 1);
        bindNav(lb.querySelector(&#39;.lb-prev&#39;), -1);
        bindNav(lb.querySelector(&#39;.lb-next&#39;), 1);

        lb.querySelector(&#39;.lb-close-btn&#39;).onclick = (e) =&gt; { e.stopPropagation(); closeLightbox(); };
        lbLinkBtn.onclick = (e) =&gt; { e.stopPropagation(); };

        lb.onclick = (e) =&gt; {
            if (e.target === lb || e.target.classList.contains(&#39;lb-canvas&#39;)) closeLightbox();
        };

        document.addEventListener(&#39;keydown&#39;, (e) =&gt; {
            if (!lb.classList.contains(&#39;active&#39;)) return;
            if (e.key === &#39;ArrowLeft&#39;) switchTo(currentIndex - 1);
            if (e.key === &#39;ArrowRight&#39;) switchTo(currentIndex + 1);
            if (e.key === &#39;Escape&#39;) closeLightbox();
        });

        
        switchTo(0);
    })();
&lt;/script&gt;
&lt;h2 id=&#34;网站--资源&#34;&gt;网站 &amp;amp; 资源
&lt;/h2&gt;&lt;h3 id=&#34;karakeep&#34;&gt;karakeep
&lt;/h3&gt;



 
   












    
    
    
    
     
    
     
        





    &lt;a href=&#34;https://github.com/karakeep-app/karakeep&#34; class=&#34;qsl-card&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;
        &lt;div class=&#34;qsl-visual&#34;&gt;
            
                &lt;img src=&#34;https://raw.githubusercontent.com/karakeep-app/karakeep/main/screenshots/homepage.png&#34; alt=&#34;karakeep&#34; class=&#34;qsl-image&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
            
        &lt;/div&gt;

        &lt;div class=&#34;qsl-content&#34;&gt;
            &lt;div class=&#34;qsl-meta&#34;&gt;
                &lt;span class=&#34;qsl-badge&#34;&gt;推荐&lt;/span&gt;
                
            &lt;/div&gt;
            
            &lt;h4 class=&#34;qsl-title&#34;&gt;
                karakeep
            &lt;/h4&gt;
            
            &lt;div class=&#34;qsl-summary&#34;&gt;
                A self-hostable bookmark-everything app (links，notes and images) with AI-based automatic tagging and full text search.
            &lt;/div&gt;
            
            &lt;span class=&#34;qsl-arrow&#34;&gt;
                阅读全文 &amp;rarr;
            &lt;/span&gt;
        &lt;/div&gt;
    &lt;/a&gt;



&lt;style&gt;
     
    .qsl-card {
         
        --qsl-bg-card: #ffffff;
        --qsl-bg-visual: #f8f9fa;
        
        --qsl-border: rgba(0,0,0,0.08);
        --qsl-border-visual: rgba(0,0,0,0.04);
        
        --qsl-shadow: 0 4px 6px rgba(0,0,0,0.02);
        --qsl-shadow-hover: 0 12px 25px rgba(0,0,0,0.08);
        
        --qsl-text-title: #2d3748;
        --qsl-text-summary: #718096;
        --qsl-text-date: #999999;
        
        --qsl-icon-color: #cbd5e0;
        
        --qsl-badge-bg: rgba(58, 123, 213, 0.1);
        --qsl-badge-text: #3a7bd5;
        
        --qsl-highlight: #3a7bd5;

        display: flex;
        align-items: stretch;
        background: var(--qsl-bg-card);
        border: 1px solid var(--qsl-border);
        border-radius: 12px;
        text-decoration: none !important;
        margin: 2rem 0;
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, border-color 0.2s, background 0.3s;
        font-family: inherit;
        box-shadow: var(--qsl-shadow);
        color: inherit;
        height: 160px;  
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .qsl-card {
            --qsl-bg-card: #1e1e1e;
            --qsl-bg-visual: #252525;
            
            --qsl-border: #333333;
            --qsl-border-visual: #333333;
            
            --qsl-shadow: 0 4px 6px rgba(0,0,0,0.2);
            --qsl-shadow-hover: 0 12px 25px rgba(0,0,0,0.4);
            
            --qsl-text-title: #f0f0f0;
            --qsl-text-summary: #a0aec0;
            --qsl-text-date: #888888;
            
            --qsl-icon-color: #555555;
            
            --qsl-badge-bg: rgba(99, 179, 237, 0.15);
            --qsl-badge-text: #63b3ed;
            
            --qsl-highlight: #63b3ed;
        }
    }

    html[data-scheme=&#34;dark&#34;] .qsl-card {
        --qsl-bg-card: #1e1e1e;
        --qsl-bg-visual: #252525;
        
        --qsl-border: #333333;
        --qsl-border-visual: #333333;
        
        --qsl-shadow: 0 4px 6px rgba(0,0,0,0.2);
        --qsl-shadow-hover: 0 12px 25px rgba(0,0,0,0.4);
        
        --qsl-text-title: #f0f0f0;
        --qsl-text-summary: #a0aec0;
        --qsl-text-date: #888888;
        
        --qsl-icon-color: #555555;
        
        --qsl-badge-bg: rgba(99, 179, 237, 0.15);
        --qsl-badge-text: #63b3ed;
        
        --qsl-highlight: #63b3ed;
    }

    .qsl-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--qsl-shadow-hover);
        border-color: var(--qsl-highlight);
    }

    .qsl-visual {
        width: 140px; 
        flex-shrink: 0;
        background: var(--qsl-bg-visual);
        display: flex;
        align-items: center;
        justify-content: center;
        border-right: 1px solid var(--qsl-border-visual);
        position: relative;
        overflow: hidden;
        transition: background 0.3s, border-color 0.3s;
    }

    .qsl-image {
        width: 100%;
        height: 100%;
        object-fit: cover;
        transition: transform 0.5s ease;
    }
    .qsl-card:hover .qsl-image { transform: scale(1.05); }

    .qsl-icon-box { color: var(--qsl-icon-color); transition: color 0.3s; }
    .qsl-card:hover .qsl-icon-box { color: var(--qsl-highlight); }
    .qsl-icon-box svg { width: 40px; height: 40px; }

    .qsl-content {
        padding: 16px 20px;
        flex: 1;
        display: flex;
        flex-direction: column;
        justify-content: space-between; 
        min-width: 0;
    }

    .qsl-meta {
        display: flex;
        align-items: center;
        gap: 10px;
        font-size: 12px;
    }

    .qsl-badge {
        background: var(--qsl-badge-bg);
        color: var(--qsl-badge-text);
        padding: 2px 8px;
        border-radius: 4px;
        font-weight: 700;
        text-transform: uppercase;
        font-size: 1.1rem;
        transition: background 0.3s, color 0.3s;
    }

    .qsl-date { color: var(--qsl-text-date); transition: color 0.3s; }

    .qsl-title {
        margin: 0;
        font-size: 1.4rem;
        font-weight: 700;
        color: var(--qsl-text-title);
        line-height: 1.4;
        display: -webkit-box;
        -webkit-line-clamp: 2; 
        -webkit-box-orient: vertical;
        overflow: hidden;
        transition: color 0.3s;
    }
    .qsl-card:hover .qsl-title { color: var(--qsl-highlight); }

    .qsl-summary {
        font-size: 1.3rem;
        color: var(--qsl-text-summary);
        line-height: 1.5;
        display: -webkit-box;
        -webkit-line-clamp: 2; 
        -webkit-box-orient: vertical;
        overflow: hidden;
        transition: color 0.3s;
    }

    .qsl-arrow {
        font-size: 12px;
        font-weight: 600;
        color: var(--qsl-highlight);
        opacity: 0;
        transform: translateX(-10px);
        transition: all 0.2s ease;
        margin-top: auto; 
    }
    .qsl-card:hover .qsl-arrow {
        opacity: 1;
        transform: translateX(0);
    }

    @media (max-width: 600px) {
        .qsl-card { flex-direction: column; height: auto; }
        .qsl-visual { width: 100%; height: 140px; border-right: none; border-bottom: 1px solid var(--qsl-border-visual); }
        .qsl-content { padding: 15px; gap: 10px; }
        .qsl-arrow { opacity: 1; transform: none; display: block; margin-top: 5px; }
    }
&lt;/style&gt;
&lt;h3 id=&#34;openstock&#34;&gt;OpenStock
&lt;/h3&gt;



 
   












    
    
    
    
     
    
     
        





    &lt;a href=&#34;https://github.com/Open-Dev-Society/OpenStock&#34; class=&#34;qsl-card&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;
        &lt;div class=&#34;qsl-visual&#34;&gt;
            
                &lt;img src=&#34;https://github.com/Open-Dev-Society/OpenStock/raw/main/public/assets/images/dashboard.png&#34; alt=&#34;OpenStock&#34; class=&#34;qsl-image&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
            
        &lt;/div&gt;

        &lt;div class=&#34;qsl-content&#34;&gt;
            &lt;div class=&#34;qsl-meta&#34;&gt;
                &lt;span class=&#34;qsl-badge&#34;&gt;推荐&lt;/span&gt;
                
            &lt;/div&gt;
            
            &lt;h4 class=&#34;qsl-title&#34;&gt;
                OpenStock
            &lt;/h4&gt;
            
            &lt;div class=&#34;qsl-summary&#34;&gt;
                OpenStock is an open-source alternative to expensive market platforms. Track real-time prices，set personalized alerts，and explore detailed company insights — built openly，for everyone，forever free.
            &lt;/div&gt;
            
            &lt;span class=&#34;qsl-arrow&#34;&gt;
                阅读全文 &amp;rarr;
            &lt;/span&gt;
        &lt;/div&gt;
    &lt;/a&gt;



&lt;style&gt;
     
    .qsl-card {
         
        --qsl-bg-card: #ffffff;
        --qsl-bg-visual: #f8f9fa;
        
        --qsl-border: rgba(0,0,0,0.08);
        --qsl-border-visual: rgba(0,0,0,0.04);
        
        --qsl-shadow: 0 4px 6px rgba(0,0,0,0.02);
        --qsl-shadow-hover: 0 12px 25px rgba(0,0,0,0.08);
        
        --qsl-text-title: #2d3748;
        --qsl-text-summary: #718096;
        --qsl-text-date: #999999;
        
        --qsl-icon-color: #cbd5e0;
        
        --qsl-badge-bg: rgba(58, 123, 213, 0.1);
        --qsl-badge-text: #3a7bd5;
        
        --qsl-highlight: #3a7bd5;

        display: flex;
        align-items: stretch;
        background: var(--qsl-bg-card);
        border: 1px solid var(--qsl-border);
        border-radius: 12px;
        text-decoration: none !important;
        margin: 2rem 0;
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, border-color 0.2s, background 0.3s;
        font-family: inherit;
        box-shadow: var(--qsl-shadow);
        color: inherit;
        height: 160px;  
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .qsl-card {
            --qsl-bg-card: #1e1e1e;
            --qsl-bg-visual: #252525;
            
            --qsl-border: #333333;
            --qsl-border-visual: #333333;
            
            --qsl-shadow: 0 4px 6px rgba(0,0,0,0.2);
            --qsl-shadow-hover: 0 12px 25px rgba(0,0,0,0.4);
            
            --qsl-text-title: #f0f0f0;
            --qsl-text-summary: #a0aec0;
            --qsl-text-date: #888888;
            
            --qsl-icon-color: #555555;
            
            --qsl-badge-bg: rgba(99, 179, 237, 0.15);
            --qsl-badge-text: #63b3ed;
            
            --qsl-highlight: #63b3ed;
        }
    }

    html[data-scheme=&#34;dark&#34;] .qsl-card {
        --qsl-bg-card: #1e1e1e;
        --qsl-bg-visual: #252525;
        
        --qsl-border: #333333;
        --qsl-border-visual: #333333;
        
        --qsl-shadow: 0 4px 6px rgba(0,0,0,0.2);
        --qsl-shadow-hover: 0 12px 25px rgba(0,0,0,0.4);
        
        --qsl-text-title: #f0f0f0;
        --qsl-text-summary: #a0aec0;
        --qsl-text-date: #888888;
        
        --qsl-icon-color: #555555;
        
        --qsl-badge-bg: rgba(99, 179, 237, 0.15);
        --qsl-badge-text: #63b3ed;
        
        --qsl-highlight: #63b3ed;
    }

    .qsl-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--qsl-shadow-hover);
        border-color: var(--qsl-highlight);
    }

    .qsl-visual {
        width: 140px; 
        flex-shrink: 0;
        background: var(--qsl-bg-visual);
        display: flex;
        align-items: center;
        justify-content: center;
        border-right: 1px solid var(--qsl-border-visual);
        position: relative;
        overflow: hidden;
        transition: background 0.3s, border-color 0.3s;
    }

    .qsl-image {
        width: 100%;
        height: 100%;
        object-fit: cover;
        transition: transform 0.5s ease;
    }
    .qsl-card:hover .qsl-image { transform: scale(1.05); }

    .qsl-icon-box { color: var(--qsl-icon-color); transition: color 0.3s; }
    .qsl-card:hover .qsl-icon-box { color: var(--qsl-highlight); }
    .qsl-icon-box svg { width: 40px; height: 40px; }

    .qsl-content {
        padding: 16px 20px;
        flex: 1;
        display: flex;
        flex-direction: column;
        justify-content: space-between; 
        min-width: 0;
    }

    .qsl-meta {
        display: flex;
        align-items: center;
        gap: 10px;
        font-size: 12px;
    }

    .qsl-badge {
        background: var(--qsl-badge-bg);
        color: var(--qsl-badge-text);
        padding: 2px 8px;
        border-radius: 4px;
        font-weight: 700;
        text-transform: uppercase;
        font-size: 1.1rem;
        transition: background 0.3s, color 0.3s;
    }

    .qsl-date { color: var(--qsl-text-date); transition: color 0.3s; }

    .qsl-title {
        margin: 0;
        font-size: 1.4rem;
        font-weight: 700;
        color: var(--qsl-text-title);
        line-height: 1.4;
        display: -webkit-box;
        -webkit-line-clamp: 2; 
        -webkit-box-orient: vertical;
        overflow: hidden;
        transition: color 0.3s;
    }
    .qsl-card:hover .qsl-title { color: var(--qsl-highlight); }

    .qsl-summary {
        font-size: 1.3rem;
        color: var(--qsl-text-summary);
        line-height: 1.5;
        display: -webkit-box;
        -webkit-line-clamp: 2; 
        -webkit-box-orient: vertical;
        overflow: hidden;
        transition: color 0.3s;
    }

    .qsl-arrow {
        font-size: 12px;
        font-weight: 600;
        color: var(--qsl-highlight);
        opacity: 0;
        transform: translateX(-10px);
        transition: all 0.2s ease;
        margin-top: auto; 
    }
    .qsl-card:hover .qsl-arrow {
        opacity: 1;
        transform: translateX(0);
    }

    @media (max-width: 600px) {
        .qsl-card { flex-direction: column; height: auto; }
        .qsl-visual { width: 100%; height: 140px; border-right: none; border-bottom: 1px solid var(--qsl-border-visual); }
        .qsl-content { padding: 15px; gap: 10px; }
        .qsl-arrow { opacity: 1; transform: none; display: block; margin-top: 5px; }
    }
&lt;/style&gt;
&lt;h3 id=&#34;游戏拾光&#34;&gt;游戏拾光
&lt;/h3&gt;



 
   












    
    
    
    
     
    
     
        





    &lt;a href=&#34;https://github.com/game1024/OpenSpeedy?tab=readme-ov-file&#34; class=&#34;qsl-card&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;
        &lt;div class=&#34;qsl-visual&#34;&gt;
            
                &lt;div class=&#34;qsl-icon-box&#34;&gt;
                    &lt;svg viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;1.5&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34;&gt;&lt;/path&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;/div&gt;
            
        &lt;/div&gt;

        &lt;div class=&#34;qsl-content&#34;&gt;
            &lt;div class=&#34;qsl-meta&#34;&gt;
                &lt;span class=&#34;qsl-badge&#34;&gt;推荐&lt;/span&gt;
                
            &lt;/div&gt;
            
            &lt;h4 class=&#34;qsl-title&#34;&gt;
                游戏拾光
            &lt;/h4&gt;
            
            &lt;div class=&#34;qsl-summary&#34;&gt;
                游戏拾光（英文名Gamekeeper）是一款优秀的游戏存档管理软件，它可以自动识别游戏的存档目录，并记录您的每一次游玩瞬间，使用它可以帮您随时随地保存游戏存档，并分享给身边的朋友。
            &lt;/div&gt;
            
            &lt;span class=&#34;qsl-arrow&#34;&gt;
                阅读全文 &amp;rarr;
            &lt;/span&gt;
        &lt;/div&gt;
    &lt;/a&gt;



&lt;style&gt;
     
    .qsl-card {
         
        --qsl-bg-card: #ffffff;
        --qsl-bg-visual: #f8f9fa;
        
        --qsl-border: rgba(0,0,0,0.08);
        --qsl-border-visual: rgba(0,0,0,0.04);
        
        --qsl-shadow: 0 4px 6px rgba(0,0,0,0.02);
        --qsl-shadow-hover: 0 12px 25px rgba(0,0,0,0.08);
        
        --qsl-text-title: #2d3748;
        --qsl-text-summary: #718096;
        --qsl-text-date: #999999;
        
        --qsl-icon-color: #cbd5e0;
        
        --qsl-badge-bg: rgba(58, 123, 213, 0.1);
        --qsl-badge-text: #3a7bd5;
        
        --qsl-highlight: #3a7bd5;

        display: flex;
        align-items: stretch;
        background: var(--qsl-bg-card);
        border: 1px solid var(--qsl-border);
        border-radius: 12px;
        text-decoration: none !important;
        margin: 2rem 0;
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, border-color 0.2s, background 0.3s;
        font-family: inherit;
        box-shadow: var(--qsl-shadow);
        color: inherit;
        height: 160px;  
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .qsl-card {
            --qsl-bg-card: #1e1e1e;
            --qsl-bg-visual: #252525;
            
            --qsl-border: #333333;
            --qsl-border-visual: #333333;
            
            --qsl-shadow: 0 4px 6px rgba(0,0,0,0.2);
            --qsl-shadow-hover: 0 12px 25px rgba(0,0,0,0.4);
            
            --qsl-text-title: #f0f0f0;
            --qsl-text-summary: #a0aec0;
            --qsl-text-date: #888888;
            
            --qsl-icon-color: #555555;
            
            --qsl-badge-bg: rgba(99, 179, 237, 0.15);
            --qsl-badge-text: #63b3ed;
            
            --qsl-highlight: #63b3ed;
        }
    }

    html[data-scheme=&#34;dark&#34;] .qsl-card {
        --qsl-bg-card: #1e1e1e;
        --qsl-bg-visual: #252525;
        
        --qsl-border: #333333;
        --qsl-border-visual: #333333;
        
        --qsl-shadow: 0 4px 6px rgba(0,0,0,0.2);
        --qsl-shadow-hover: 0 12px 25px rgba(0,0,0,0.4);
        
        --qsl-text-title: #f0f0f0;
        --qsl-text-summary: #a0aec0;
        --qsl-text-date: #888888;
        
        --qsl-icon-color: #555555;
        
        --qsl-badge-bg: rgba(99, 179, 237, 0.15);
        --qsl-badge-text: #63b3ed;
        
        --qsl-highlight: #63b3ed;
    }

    .qsl-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--qsl-shadow-hover);
        border-color: var(--qsl-highlight);
    }

    .qsl-visual {
        width: 140px; 
        flex-shrink: 0;
        background: var(--qsl-bg-visual);
        display: flex;
        align-items: center;
        justify-content: center;
        border-right: 1px solid var(--qsl-border-visual);
        position: relative;
        overflow: hidden;
        transition: background 0.3s, border-color 0.3s;
    }

    .qsl-image {
        width: 100%;
        height: 100%;
        object-fit: cover;
        transition: transform 0.5s ease;
    }
    .qsl-card:hover .qsl-image { transform: scale(1.05); }

    .qsl-icon-box { color: var(--qsl-icon-color); transition: color 0.3s; }
    .qsl-card:hover .qsl-icon-box { color: var(--qsl-highlight); }
    .qsl-icon-box svg { width: 40px; height: 40px; }

    .qsl-content {
        padding: 16px 20px;
        flex: 1;
        display: flex;
        flex-direction: column;
        justify-content: space-between; 
        min-width: 0;
    }

    .qsl-meta {
        display: flex;
        align-items: center;
        gap: 10px;
        font-size: 12px;
    }

    .qsl-badge {
        background: var(--qsl-badge-bg);
        color: var(--qsl-badge-text);
        padding: 2px 8px;
        border-radius: 4px;
        font-weight: 700;
        text-transform: uppercase;
        font-size: 1.1rem;
        transition: background 0.3s, color 0.3s;
    }

    .qsl-date { color: var(--qsl-text-date); transition: color 0.3s; }

    .qsl-title {
        margin: 0;
        font-size: 1.4rem;
        font-weight: 700;
        color: var(--qsl-text-title);
        line-height: 1.4;
        display: -webkit-box;
        -webkit-line-clamp: 2; 
        -webkit-box-orient: vertical;
        overflow: hidden;
        transition: color 0.3s;
    }
    .qsl-card:hover .qsl-title { color: var(--qsl-highlight); }

    .qsl-summary {
        font-size: 1.3rem;
        color: var(--qsl-text-summary);
        line-height: 1.5;
        display: -webkit-box;
        -webkit-line-clamp: 2; 
        -webkit-box-orient: vertical;
        overflow: hidden;
        transition: color 0.3s;
    }

    .qsl-arrow {
        font-size: 12px;
        font-weight: 600;
        color: var(--qsl-highlight);
        opacity: 0;
        transform: translateX(-10px);
        transition: all 0.2s ease;
        margin-top: auto; 
    }
    .qsl-card:hover .qsl-arrow {
        opacity: 1;
        transform: translateX(0);
    }

    @media (max-width: 600px) {
        .qsl-card { flex-direction: column; height: auto; }
        .qsl-visual { width: 100%; height: 140px; border-right: none; border-bottom: 1px solid var(--qsl-border-visual); }
        .qsl-content { padding: 15px; gap: 10px; }
        .qsl-arrow { opacity: 1; transform: none; display: block; margin-top: 5px; }
    }
&lt;/style&gt;
&lt;h3 id=&#34;openspeedy&#34;&gt;OpenSpeedy
&lt;/h3&gt;



 
   












    
    
    
    
     
    
     
        





    &lt;a href=&#34;https://gamekeeper.thinkuni.net/&#34; class=&#34;qsl-card&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;
        &lt;div class=&#34;qsl-visual&#34;&gt;
            
                &lt;div class=&#34;qsl-icon-box&#34;&gt;
                    &lt;svg viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;1.5&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34;&gt;&lt;/path&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;/div&gt;
            
        &lt;/div&gt;

        &lt;div class=&#34;qsl-content&#34;&gt;
            &lt;div class=&#34;qsl-meta&#34;&gt;
                &lt;span class=&#34;qsl-badge&#34;&gt;推荐&lt;/span&gt;
                
            &lt;/div&gt;
            
            &lt;h4 class=&#34;qsl-title&#34;&gt;
                OpenSpeedy
            &lt;/h4&gt;
            
            &lt;div class=&#34;qsl-summary&#34;&gt;
                OpenSpeedy 是一款开源免费的游戏变速工具，让你的游戏突破帧率限制，提供更流畅丝滑的游戏加速体验。
            &lt;/div&gt;
            
            &lt;span class=&#34;qsl-arrow&#34;&gt;
                阅读全文 &amp;rarr;
            &lt;/span&gt;
        &lt;/div&gt;
    &lt;/a&gt;



&lt;style&gt;
     
    .qsl-card {
         
        --qsl-bg-card: #ffffff;
        --qsl-bg-visual: #f8f9fa;
        
        --qsl-border: rgba(0,0,0,0.08);
        --qsl-border-visual: rgba(0,0,0,0.04);
        
        --qsl-shadow: 0 4px 6px rgba(0,0,0,0.02);
        --qsl-shadow-hover: 0 12px 25px rgba(0,0,0,0.08);
        
        --qsl-text-title: #2d3748;
        --qsl-text-summary: #718096;
        --qsl-text-date: #999999;
        
        --qsl-icon-color: #cbd5e0;
        
        --qsl-badge-bg: rgba(58, 123, 213, 0.1);
        --qsl-badge-text: #3a7bd5;
        
        --qsl-highlight: #3a7bd5;

        display: flex;
        align-items: stretch;
        background: var(--qsl-bg-card);
        border: 1px solid var(--qsl-border);
        border-radius: 12px;
        text-decoration: none !important;
        margin: 2rem 0;
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, border-color 0.2s, background 0.3s;
        font-family: inherit;
        box-shadow: var(--qsl-shadow);
        color: inherit;
        height: 160px;  
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .qsl-card {
            --qsl-bg-card: #1e1e1e;
            --qsl-bg-visual: #252525;
            
            --qsl-border: #333333;
            --qsl-border-visual: #333333;
            
            --qsl-shadow: 0 4px 6px rgba(0,0,0,0.2);
            --qsl-shadow-hover: 0 12px 25px rgba(0,0,0,0.4);
            
            --qsl-text-title: #f0f0f0;
            --qsl-text-summary: #a0aec0;
            --qsl-text-date: #888888;
            
            --qsl-icon-color: #555555;
            
            --qsl-badge-bg: rgba(99, 179, 237, 0.15);
            --qsl-badge-text: #63b3ed;
            
            --qsl-highlight: #63b3ed;
        }
    }

    html[data-scheme=&#34;dark&#34;] .qsl-card {
        --qsl-bg-card: #1e1e1e;
        --qsl-bg-visual: #252525;
        
        --qsl-border: #333333;
        --qsl-border-visual: #333333;
        
        --qsl-shadow: 0 4px 6px rgba(0,0,0,0.2);
        --qsl-shadow-hover: 0 12px 25px rgba(0,0,0,0.4);
        
        --qsl-text-title: #f0f0f0;
        --qsl-text-summary: #a0aec0;
        --qsl-text-date: #888888;
        
        --qsl-icon-color: #555555;
        
        --qsl-badge-bg: rgba(99, 179, 237, 0.15);
        --qsl-badge-text: #63b3ed;
        
        --qsl-highlight: #63b3ed;
    }

    .qsl-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--qsl-shadow-hover);
        border-color: var(--qsl-highlight);
    }

    .qsl-visual {
        width: 140px; 
        flex-shrink: 0;
        background: var(--qsl-bg-visual);
        display: flex;
        align-items: center;
        justify-content: center;
        border-right: 1px solid var(--qsl-border-visual);
        position: relative;
        overflow: hidden;
        transition: background 0.3s, border-color 0.3s;
    }

    .qsl-image {
        width: 100%;
        height: 100%;
        object-fit: cover;
        transition: transform 0.5s ease;
    }
    .qsl-card:hover .qsl-image { transform: scale(1.05); }

    .qsl-icon-box { color: var(--qsl-icon-color); transition: color 0.3s; }
    .qsl-card:hover .qsl-icon-box { color: var(--qsl-highlight); }
    .qsl-icon-box svg { width: 40px; height: 40px; }

    .qsl-content {
        padding: 16px 20px;
        flex: 1;
        display: flex;
        flex-direction: column;
        justify-content: space-between; 
        min-width: 0;
    }

    .qsl-meta {
        display: flex;
        align-items: center;
        gap: 10px;
        font-size: 12px;
    }

    .qsl-badge {
        background: var(--qsl-badge-bg);
        color: var(--qsl-badge-text);
        padding: 2px 8px;
        border-radius: 4px;
        font-weight: 700;
        text-transform: uppercase;
        font-size: 1.1rem;
        transition: background 0.3s, color 0.3s;
    }

    .qsl-date { color: var(--qsl-text-date); transition: color 0.3s; }

    .qsl-title {
        margin: 0;
        font-size: 1.4rem;
        font-weight: 700;
        color: var(--qsl-text-title);
        line-height: 1.4;
        display: -webkit-box;
        -webkit-line-clamp: 2; 
        -webkit-box-orient: vertical;
        overflow: hidden;
        transition: color 0.3s;
    }
    .qsl-card:hover .qsl-title { color: var(--qsl-highlight); }

    .qsl-summary {
        font-size: 1.3rem;
        color: var(--qsl-text-summary);
        line-height: 1.5;
        display: -webkit-box;
        -webkit-line-clamp: 2; 
        -webkit-box-orient: vertical;
        overflow: hidden;
        transition: color 0.3s;
    }

    .qsl-arrow {
        font-size: 12px;
        font-weight: 600;
        color: var(--qsl-highlight);
        opacity: 0;
        transform: translateX(-10px);
        transition: all 0.2s ease;
        margin-top: auto; 
    }
    .qsl-card:hover .qsl-arrow {
        opacity: 1;
        transform: translateX(0);
    }

    @media (max-width: 600px) {
        .qsl-card { flex-direction: column; height: auto; }
        .qsl-visual { width: 100%; height: 140px; border-right: none; border-bottom: 1px solid var(--qsl-border-visual); }
        .qsl-content { padding: 15px; gap: 10px; }
        .qsl-arrow { opacity: 1; transform: none; display: block; margin-top: 5px; }
    }
&lt;/style&gt;
&lt;h3 id=&#34;timelinize&#34;&gt;timelinize
&lt;/h3&gt;



 
   












    
    
    
    
     
    
     
        





    &lt;a href=&#34;https://github.com/timelinize/timelinize?tab=readme-ov-file&#34; class=&#34;qsl-card&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;
        &lt;div class=&#34;qsl-visual&#34;&gt;
            
                &lt;div class=&#34;qsl-icon-box&#34;&gt;
                    &lt;svg viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;1.5&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34;&gt;&lt;/path&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;/div&gt;
            
        &lt;/div&gt;

        &lt;div class=&#34;qsl-content&#34;&gt;
            &lt;div class=&#34;qsl-meta&#34;&gt;
                &lt;span class=&#34;qsl-badge&#34;&gt;推荐&lt;/span&gt;
                
            &lt;/div&gt;
            
            &lt;h4 class=&#34;qsl-title&#34;&gt;
                timelinize
            &lt;/h4&gt;
            
            &lt;div class=&#34;qsl-summary&#34;&gt;
                Store your data from all your accounts and devices in a single cohesive timeline on your own computer.
            &lt;/div&gt;
            
            &lt;span class=&#34;qsl-arrow&#34;&gt;
                阅读全文 &amp;rarr;
            &lt;/span&gt;
        &lt;/div&gt;
    &lt;/a&gt;



&lt;style&gt;
     
    .qsl-card {
         
        --qsl-bg-card: #ffffff;
        --qsl-bg-visual: #f8f9fa;
        
        --qsl-border: rgba(0,0,0,0.08);
        --qsl-border-visual: rgba(0,0,0,0.04);
        
        --qsl-shadow: 0 4px 6px rgba(0,0,0,0.02);
        --qsl-shadow-hover: 0 12px 25px rgba(0,0,0,0.08);
        
        --qsl-text-title: #2d3748;
        --qsl-text-summary: #718096;
        --qsl-text-date: #999999;
        
        --qsl-icon-color: #cbd5e0;
        
        --qsl-badge-bg: rgba(58, 123, 213, 0.1);
        --qsl-badge-text: #3a7bd5;
        
        --qsl-highlight: #3a7bd5;

        display: flex;
        align-items: stretch;
        background: var(--qsl-bg-card);
        border: 1px solid var(--qsl-border);
        border-radius: 12px;
        text-decoration: none !important;
        margin: 2rem 0;
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, border-color 0.2s, background 0.3s;
        font-family: inherit;
        box-shadow: var(--qsl-shadow);
        color: inherit;
        height: 160px;  
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .qsl-card {
            --qsl-bg-card: #1e1e1e;
            --qsl-bg-visual: #252525;
            
            --qsl-border: #333333;
            --qsl-border-visual: #333333;
            
            --qsl-shadow: 0 4px 6px rgba(0,0,0,0.2);
            --qsl-shadow-hover: 0 12px 25px rgba(0,0,0,0.4);
            
            --qsl-text-title: #f0f0f0;
            --qsl-text-summary: #a0aec0;
            --qsl-text-date: #888888;
            
            --qsl-icon-color: #555555;
            
            --qsl-badge-bg: rgba(99, 179, 237, 0.15);
            --qsl-badge-text: #63b3ed;
            
            --qsl-highlight: #63b3ed;
        }
    }

    html[data-scheme=&#34;dark&#34;] .qsl-card {
        --qsl-bg-card: #1e1e1e;
        --qsl-bg-visual: #252525;
        
        --qsl-border: #333333;
        --qsl-border-visual: #333333;
        
        --qsl-shadow: 0 4px 6px rgba(0,0,0,0.2);
        --qsl-shadow-hover: 0 12px 25px rgba(0,0,0,0.4);
        
        --qsl-text-title: #f0f0f0;
        --qsl-text-summary: #a0aec0;
        --qsl-text-date: #888888;
        
        --qsl-icon-color: #555555;
        
        --qsl-badge-bg: rgba(99, 179, 237, 0.15);
        --qsl-badge-text: #63b3ed;
        
        --qsl-highlight: #63b3ed;
    }

    .qsl-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--qsl-shadow-hover);
        border-color: var(--qsl-highlight);
    }

    .qsl-visual {
        width: 140px; 
        flex-shrink: 0;
        background: var(--qsl-bg-visual);
        display: flex;
        align-items: center;
        justify-content: center;
        border-right: 1px solid var(--qsl-border-visual);
        position: relative;
        overflow: hidden;
        transition: background 0.3s, border-color 0.3s;
    }

    .qsl-image {
        width: 100%;
        height: 100%;
        object-fit: cover;
        transition: transform 0.5s ease;
    }
    .qsl-card:hover .qsl-image { transform: scale(1.05); }

    .qsl-icon-box { color: var(--qsl-icon-color); transition: color 0.3s; }
    .qsl-card:hover .qsl-icon-box { color: var(--qsl-highlight); }
    .qsl-icon-box svg { width: 40px; height: 40px; }

    .qsl-content {
        padding: 16px 20px;
        flex: 1;
        display: flex;
        flex-direction: column;
        justify-content: space-between; 
        min-width: 0;
    }

    .qsl-meta {
        display: flex;
        align-items: center;
        gap: 10px;
        font-size: 12px;
    }

    .qsl-badge {
        background: var(--qsl-badge-bg);
        color: var(--qsl-badge-text);
        padding: 2px 8px;
        border-radius: 4px;
        font-weight: 700;
        text-transform: uppercase;
        font-size: 1.1rem;
        transition: background 0.3s, color 0.3s;
    }

    .qsl-date { color: var(--qsl-text-date); transition: color 0.3s; }

    .qsl-title {
        margin: 0;
        font-size: 1.4rem;
        font-weight: 700;
        color: var(--qsl-text-title);
        line-height: 1.4;
        display: -webkit-box;
        -webkit-line-clamp: 2; 
        -webkit-box-orient: vertical;
        overflow: hidden;
        transition: color 0.3s;
    }
    .qsl-card:hover .qsl-title { color: var(--qsl-highlight); }

    .qsl-summary {
        font-size: 1.3rem;
        color: var(--qsl-text-summary);
        line-height: 1.5;
        display: -webkit-box;
        -webkit-line-clamp: 2; 
        -webkit-box-orient: vertical;
        overflow: hidden;
        transition: color 0.3s;
    }

    .qsl-arrow {
        font-size: 12px;
        font-weight: 600;
        color: var(--qsl-highlight);
        opacity: 0;
        transform: translateX(-10px);
        transition: all 0.2s ease;
        margin-top: auto; 
    }
    .qsl-card:hover .qsl-arrow {
        opacity: 1;
        transform: translateX(0);
    }

    @media (max-width: 600px) {
        .qsl-card { flex-direction: column; height: auto; }
        .qsl-visual { width: 100%; height: 140px; border-right: none; border-bottom: 1px solid var(--qsl-border-visual); }
        .qsl-content { padding: 15px; gap: 10px; }
        .qsl-arrow { opacity: 1; transform: none; display: block; margin-top: 5px; }
    }
&lt;/style&gt;
&lt;p&gt;Thank &lt;a class=&#34;link&#34; href=&#34;https://www.pexels.com/photo/tranquil-autumn-scene-at-austrian-lakeside-cabin-34229770/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Cover of this article by Daniel J. Schwarz&lt;/a&gt;&lt;/p&gt;
</description>
        </item>
        <item>
        <title>「SF周刊」2025年第31 32期（合刊）（总第31-32期）</title>
        <link>https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A2025%E5%B9%B4%E7%AC%AC31-32%E6%9C%9F%E5%90%88%E5%88%8A%E6%80%BB%E7%AC%AC31-32%E6%9C%9F/</link>
        <pubDate>Thu, 09 Oct 2025 00:00:00 +0000</pubDate>
        
        <guid>https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A2025%E5%B9%B4%E7%AC%AC31-32%E6%9C%9F%E5%90%88%E5%88%8A%E6%80%BB%E7%AC%AC31-32%E6%9C%9F/</guid>
        <description>&lt;img src="https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A2025%E5%B9%B4%E7%AC%AC31-32%E6%9C%9F%E5%90%88%E5%88%8A%E6%80%BB%E7%AC%AC31-32%E6%9C%9F/20251009-home.jpg" alt="Featured image of post 「SF周刊」2025年第31 32期（合刊）（总第31-32期）" /&gt;&lt;div class=&#34;timeline__row&#34;&gt;
    &lt;div class=&#34;timeline__time&#34;&gt;
        &lt;div class=&#34;timeline__time&#34;&gt;2025-10-01&lt;/div&gt;
        &lt;div class=&#34;timeline__split-line&#34;&gt;&lt;/div&gt;
    &lt;/div&gt;
    &lt;div class=&#34;timeline__content&#34;&gt;
        &lt;div class=&#34;timeline__tags&#34;&gt;
            &lt;span class=&#34;timeline__tag&#34;&gt;节日&lt;/span&gt;
        &lt;/div&gt;
        &lt;a href=&#34;https://baike.baidu.com/item/%E4%B8%AD%E5%8D%8E%E4%BA%BA%E6%B0%91%E5%85%B1%E5%92%8C%E5%9B%BD%E5%9B%BD%E5%BA%86%E8%8A%82/1041892&#34;&gt;
            &lt;div class=&#34;timeline__title&#34;&gt;中华人民共和国国庆节&lt;/div&gt;
        &lt;/a&gt;
        
        &lt;div class=&#34;timeline__description&#34;&gt;
            “国庆”一词，本指国家喜庆之事，最早见于西晋。新中国成立后，以每年10月1日为中华人民共和国国庆日。
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;style&gt;
    .timeline {
        display: flex;
        flex-direction: column;
    }
    
    .timeline__row {
        display: flex;
        padding-left: 4%;
        height: 90px;
    }
    
    .timeline__time {
        flex: 0 0 110px;
        color: #5d5d5d;
        font-size: 17px;
        text-transform: uppercase;
        position: relative;
        display: flex;
        flex-direction: column;
        align-items: center;
        padding: 0.5rem 0;
    }
    
    .timeline__time-text {
        margin: 0;
    }
    
    .timeline__split-line {
        position: absolute;
        top: 0.5rem;
        right: -20px;
        height: 100%;
        width: 2px;
        background-color: #84c4e240;
        z-index: 0;
    }
    
    .timeline__split-line:before {
        content: &#34;&#34;;
        position: absolute;
        top: 24%;
        right: -4px;
        transform: translateY(-50%);
        width: 10px;
        height: 10px;
        background-color: #c9e5f2;
        box-shadow: 0 0 0 4px var(--theme);
        border-radius: 50%;
        border: 0px solid #84c4e2;
        z-index: -1;
    }
    
    .timeline__content {
        flex: 1;
        margin-left: 4.5rem;
        padding: 0.5rem 0 1.2rem 0;
    }
    
    .timeline__title {
        margin: 0;
        margin-bottom: 2px;
        padding-top: 3px;
        margin-left: 0.5rem;
        color: var(--content);
        font-family: var(--font-family-teshu);
        font-size: 19px;
        font-weight: 600;
        width: fit-content;
        display: inline-block;
        vertical-align: middle;
         
    }
    
    .timeline__tags {
        display: inline-block;
        padding: 0;
        margin-left: 0.3rem;
        align-items: center;
        gap: 0.3rem;
    }
    
    .timeline__tag {
        display: inline-block;
        color: var(--secondary);
        background-color: #84c4e230;
        border: 1.5px solid #84c4e230;
        border-radius: 999px;
        padding: 0rem 0.5rem;
        font-size: 12px;
        white-space: nowrap;
        line-height: 1.4rem;
        opacity: 0.8;
        vertical-align: middle;
         
    }
    
    .timeline__description {
        font-size: 15px;
        line-height: 1.6;
        color: #5d5d5d;
        overflow: hidden;
        text-overflow: ellipsis;
        margin: 0.5rem 0 0.4rem 1.5rem;
         
    }
     
    
    .timeline__tag-style {
        background-color: #c581da;
         
        border-color: #c581da;
         
        color: #FFFFFF;
         
    }
     
    
    .timeline__tag-article {
        background-color: #92d392;
         
        border-color: #92d392;
         
        color: #000000;
         
    }
     
    
    .timeline__tag-page {
        background-color: #707070;
         
        border-color: #707070;
         
        color: #FFFFFF;
         
    }
    
    @media screen and (max-width: 768px) {
        .timeline__time {
            font-size: 14px;
             
        }
        .timeline__title {
            font-size: 16px;
             
        }
        .timeline__description {
            font-size: 14px;
             
        }
    }
&lt;/style&gt;

&lt;div class=&#34;timeline__row&#34;&gt;
    &lt;div class=&#34;timeline__time&#34;&gt;
        &lt;div class=&#34;timeline__time&#34;&gt;2025-10-06&lt;/div&gt;
        &lt;div class=&#34;timeline__split-line&#34;&gt;&lt;/div&gt;
    &lt;/div&gt;
    &lt;div class=&#34;timeline__content&#34;&gt;
        &lt;div class=&#34;timeline__tags&#34;&gt;
            &lt;span class=&#34;timeline__tag&#34;&gt;节日&lt;/span&gt;
        &lt;/div&gt;
        &lt;a href=&#34;https://baike.baidu.com/item/%E4%B8%AD%E7%A7%8B%E8%8A%82/128234&#34;&gt;
            &lt;div class=&#34;timeline__title&#34;&gt;中秋节&lt;/div&gt;
        &lt;/a&gt;
        
        &lt;div class=&#34;timeline__description&#34;&gt;
            中秋节，是仲秋之节，在进入秋季的第二个月，以十五月圆为标志，这天正值三秋之中，故谓之“中秋”。
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;style&gt;
    .timeline {
        display: flex;
        flex-direction: column;
    }
    
    .timeline__row {
        display: flex;
        padding-left: 4%;
        height: 90px;
    }
    
    .timeline__time {
        flex: 0 0 110px;
        color: #5d5d5d;
        font-size: 17px;
        text-transform: uppercase;
        position: relative;
        display: flex;
        flex-direction: column;
        align-items: center;
        padding: 0.5rem 0;
    }
    
    .timeline__time-text {
        margin: 0;
    }
    
    .timeline__split-line {
        position: absolute;
        top: 0.5rem;
        right: -20px;
        height: 100%;
        width: 2px;
        background-color: #84c4e240;
        z-index: 0;
    }
    
    .timeline__split-line:before {
        content: &#34;&#34;;
        position: absolute;
        top: 24%;
        right: -4px;
        transform: translateY(-50%);
        width: 10px;
        height: 10px;
        background-color: #c9e5f2;
        box-shadow: 0 0 0 4px var(--theme);
        border-radius: 50%;
        border: 0px solid #84c4e2;
        z-index: -1;
    }
    
    .timeline__content {
        flex: 1;
        margin-left: 4.5rem;
        padding: 0.5rem 0 1.2rem 0;
    }
    
    .timeline__title {
        margin: 0;
        margin-bottom: 2px;
        padding-top: 3px;
        margin-left: 0.5rem;
        color: var(--content);
        font-family: var(--font-family-teshu);
        font-size: 19px;
        font-weight: 600;
        width: fit-content;
        display: inline-block;
        vertical-align: middle;
         
    }
    
    .timeline__tags {
        display: inline-block;
        padding: 0;
        margin-left: 0.3rem;
        align-items: center;
        gap: 0.3rem;
    }
    
    .timeline__tag {
        display: inline-block;
        color: var(--secondary);
        background-color: #84c4e230;
        border: 1.5px solid #84c4e230;
        border-radius: 999px;
        padding: 0rem 0.5rem;
        font-size: 12px;
        white-space: nowrap;
        line-height: 1.4rem;
        opacity: 0.8;
        vertical-align: middle;
         
    }
    
    .timeline__description {
        font-size: 15px;
        line-height: 1.6;
        color: #5d5d5d;
        overflow: hidden;
        text-overflow: ellipsis;
        margin: 0.5rem 0 0.4rem 1.5rem;
         
    }
     
    
    .timeline__tag-style {
        background-color: #c581da;
         
        border-color: #c581da;
         
        color: #FFFFFF;
         
    }
     
    
    .timeline__tag-article {
        background-color: #92d392;
         
        border-color: #92d392;
         
        color: #000000;
         
    }
     
    
    .timeline__tag-page {
        background-color: #707070;
         
        border-color: #707070;
         
        color: #FFFFFF;
         
    }
    
    @media screen and (max-width: 768px) {
        .timeline__time {
            font-size: 14px;
             
        }
        .timeline__title {
            font-size: 16px;
             
        }
        .timeline__description {
            font-size: 14px;
             
        }
    }
&lt;/style&gt;

&lt;h2 id=&#34;文章&#34;&gt;文章
&lt;/h2&gt;&lt;h3 id=&#34;5-个月裁员超-15-万人微软冷酷转型全面押注人工智能&#34;&gt;5 个月裁员超 1.5 万人：微软“冷酷”转型，全面押注人工智能
&lt;/h3&gt;&lt;div class=&#34;note-card&#34;&gt;
    &lt;div class=&#34;nc-accent&#34;&gt;&lt;/div&gt;

    &lt;div class=&#34;nc-header&#34;&gt;
        &lt;div class=&#34;nc-meta&#34;&gt;
            &lt;span class=&#34;nc-badge&#34;&gt;READING&lt;/span&gt;
            &lt;span class=&#34;nc-date&#34;&gt;2025-10-09&lt;/span&gt;
        &lt;/div&gt; &lt;a href=&#34;https://www.ithome.com/0/887/986.htm&#34; target=&#34;_blank&#34; class=&#34;nc-title&#34; title=&#34;访问原文&#34;&gt;
            5 个月裁员超 1.5 万人：微软“冷酷”转型，全面押注人工智能
            &lt;svg class=&#34;nc-link-icon&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
        &lt;/a&gt;
    &lt;/div&gt;

    
    &lt;div class=&#34;nc-context&#34;&gt;
        &lt;div class=&#34;nc-quote-icon&#34;&gt;“&lt;/div&gt;
        &lt;div class=&#34;nc-summary-text&#34;&gt;自2025年5月以来，微软已裁员超过15，000人，影响了Azure、销售和工程等核心领域。此次重组，在5月和7月进行了大规模裁员，被视为优先发展并大力投资人工智能的战略转变。该公司旨在重新分配资源并重塑劳动力，以在竞争激烈的AI市场中获得优势，同时表示这些变化是例行的业务管理。&lt;/div&gt;
    &lt;/div&gt;
    

    
    
    
&lt;/div&gt;

&lt;style&gt;
     
    .note-card {
         
        --nc-bg-card: #ffffff;
        --nc-border: rgba(0,0,0,0.04);
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.08);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.12);
        
        --nc-title: #2c3e50;
        --nc-title-hover: #3a7bd5;
        --nc-meta: #999999;
        
        --nc-bg-context: #f8f9fa;
        --nc-border-context: #e2e8f0;
        --nc-quote-icon: #e2e8f0;
        --nc-text-summary: #555555;
        
        --nc-label-bg: #ffffff;
        --nc-label-text: #2d3748;
        --nc-content-text: #2d3748;
        --nc-link-icon: #cbd5e0;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.1);
        --nc-badge-text: #3a7bd5;

        position: relative;
        background: var(--nc-bg-card);
        border-radius: 12px;
        box-shadow: var(--nc-shadow);
        margin: 2.5rem 0;
        overflow: hidden;
        border: 1px solid var(--nc-border);
        font-family: inherit; 
        transition: transform 0.3s ease, box-shadow 0.3s ease, background 0.3s, border-color 0.3s;
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .note-card {
            --nc-bg-card: #1e1e1e;
            --nc-border: #333333;
            --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
            --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
            
            --nc-title: #f0f0f0;
            --nc-meta: #999999;
            
            --nc-bg-context: #252525;
            --nc-border-context: #444444;
            --nc-quote-icon: #333333;
            --nc-text-summary: #aaaaaa;
            
            --nc-label-bg: #1e1e1e;
            --nc-label-text: #cccccc;
            --nc-content-text: #dddddd;
            --nc-link-icon: #666666;
            
            --nc-badge-bg: rgba(58, 123, 213, 0.2);
        }
    }

    html[data-scheme=&#34;dark&#34;] .note-card {
        --nc-bg-card: #1e1e1e;
        --nc-border: #333333;
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
        
        --nc-title: #f0f0f0;
        --nc-meta: #999999;
        
        --nc-bg-context: #252525;
        --nc-border-context: #444444;
        --nc-quote-icon: #333333;
        --nc-text-summary: #aaaaaa;
        
        --nc-label-bg: #1e1e1e;
        --nc-label-text: #cccccc;
        --nc-content-text: #dddddd;
        --nc-link-icon: #666666;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.2);
    }

    .note-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--nc-shadow-hover);
    }

     
    .nc-accent {
        height: 4px;
        background: linear-gradient(90deg, #3a7bd5, #00d2ff); 
        width: 100%;
    }

     
    .nc-header {
        padding: 24px 28px 10px; 
    }

    .nc-meta {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 10px; 
        font-size: 13px; 
        color: var(--nc-meta);
        font-weight: 600;
        letter-spacing: 1px;
        text-transform: uppercase;
    }

    .nc-badge {
        color: var(--nc-badge-text);
        background: var(--nc-badge-bg);
        padding: 2px 6px;
        border-radius: 4px;
    }

    .nc-title {
        display: block;
        font-size: 2rem; 
        font-weight: 700;
        color: var(--nc-title);
        text-decoration: none;
        line-height: 1.3;
        transition: color 0.2s;
    }

    .nc-title:hover {
        color: var(--nc-title-hover);
    }

    .nc-link-icon {
        width: 20px; 
        height: 20px;
        color: var(--nc-link-icon);
        margin-left: 5px;
        vertical-align: middle;
        transition: color 0.2s;
    }

    .nc-title:hover .nc-link-icon {
        color: var(--nc-title-hover);
    }

     
    .nc-context {
        margin: 12px 28px 24px;
        background: var(--nc-bg-context);
        padding: 20px 24px;
        border-radius: 8px;
        position: relative;
        border-left: 4px solid var(--nc-border-context);
        transition: background 0.3s, border-color 0.3s;
    }

    .nc-quote-icon {
        position: absolute;
        top: 8px;
        left: 10px;
        font-family: serif; 
        font-size: 40px;
        line-height: 1;
        color: var(--nc-quote-icon);
        pointer-events: none;
        transition: color 0.3s;
    }

    .nc-summary-text {
        font-size: 1.7rem; 
        color: var(--nc-text-summary);
        line-height: 1.6;
        font-style: italic;
        position: relative;
        z-index: 1;
        padding-left: 15px; 
        transition: color 0.3s;
    }

     
    .nc-body {
        padding: 0 28px 32px;
        position: relative;
    }

     
    .nc-label {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        font-size: 13px; 
        font-weight: 700;
        color: var(--nc-label-text);
        background: var(--nc-label-bg);
        padding-right: 10px;
        margin-bottom: 12px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
        transition: color 0.3s, background 0.3s;
    }

    .nc-content {
        color: var(--nc-content-text);
        font-size: 1.6rem; 
        line-height: 1.75;
        transition: color 0.3s;
    }

     
    .nc-content p { margin-bottom: 1em; }
    .nc-content p:last-child { margin-bottom: 0; }
    
    .nc-content ul { padding-left: 20px; color: inherit; }
    .nc-content li { margin-bottom: 6px; }
&lt;/style&gt;
&lt;h3 id=&#34;三美国科学家获得2025年诺贝尔物理学奖&#34;&gt;三美国科学家获得2025年诺贝尔物理学奖
&lt;/h3&gt;&lt;div class=&#34;note-card&#34;&gt;
    &lt;div class=&#34;nc-accent&#34;&gt;&lt;/div&gt;

    &lt;div class=&#34;nc-header&#34;&gt;
        &lt;div class=&#34;nc-meta&#34;&gt;
            &lt;span class=&#34;nc-badge&#34;&gt;READING&lt;/span&gt;
            &lt;span class=&#34;nc-date&#34;&gt;2025-10-09&lt;/span&gt;
        &lt;/div&gt; &lt;a href=&#34;http://blog.sciencenet.cn/blog-41174-1504981.html&#34; target=&#34;_blank&#34; class=&#34;nc-title&#34; title=&#34;访问原文&#34;&gt;
            三美国科学家获得2025年诺贝尔物理学奖
            &lt;svg class=&#34;nc-link-icon&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
        &lt;/a&gt;
    &lt;/div&gt;

    
    &lt;div class=&#34;nc-context&#34;&gt;
        &lt;div class=&#34;nc-quote-icon&#34;&gt;“&lt;/div&gt;
        &lt;div class=&#34;nc-summary-text&#34;&gt;三位美国科学家约翰·克拉克（John Clarke）、米歇尔·德沃雷（Michel Devoret）和约翰·马丁尼斯（John Martinis）因发现电路中的宏观量子隧穿和能量量子化而获得了2025年诺贝尔物理学奖。他们的实验在可观察的大型系统中展示了量子力学效应，例如穿过势垒的隧穿和量子化的能级，这与此类现象仅限于微观领域的观念相悖。这项工作对未来的量子技术具有重要意义。&lt;/div&gt;
    &lt;/div&gt;
    

    
    
    
&lt;/div&gt;

&lt;style&gt;
     
    .note-card {
         
        --nc-bg-card: #ffffff;
        --nc-border: rgba(0,0,0,0.04);
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.08);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.12);
        
        --nc-title: #2c3e50;
        --nc-title-hover: #3a7bd5;
        --nc-meta: #999999;
        
        --nc-bg-context: #f8f9fa;
        --nc-border-context: #e2e8f0;
        --nc-quote-icon: #e2e8f0;
        --nc-text-summary: #555555;
        
        --nc-label-bg: #ffffff;
        --nc-label-text: #2d3748;
        --nc-content-text: #2d3748;
        --nc-link-icon: #cbd5e0;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.1);
        --nc-badge-text: #3a7bd5;

        position: relative;
        background: var(--nc-bg-card);
        border-radius: 12px;
        box-shadow: var(--nc-shadow);
        margin: 2.5rem 0;
        overflow: hidden;
        border: 1px solid var(--nc-border);
        font-family: inherit; 
        transition: transform 0.3s ease, box-shadow 0.3s ease, background 0.3s, border-color 0.3s;
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .note-card {
            --nc-bg-card: #1e1e1e;
            --nc-border: #333333;
            --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
            --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
            
            --nc-title: #f0f0f0;
            --nc-meta: #999999;
            
            --nc-bg-context: #252525;
            --nc-border-context: #444444;
            --nc-quote-icon: #333333;
            --nc-text-summary: #aaaaaa;
            
            --nc-label-bg: #1e1e1e;
            --nc-label-text: #cccccc;
            --nc-content-text: #dddddd;
            --nc-link-icon: #666666;
            
            --nc-badge-bg: rgba(58, 123, 213, 0.2);
        }
    }

    html[data-scheme=&#34;dark&#34;] .note-card {
        --nc-bg-card: #1e1e1e;
        --nc-border: #333333;
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
        
        --nc-title: #f0f0f0;
        --nc-meta: #999999;
        
        --nc-bg-context: #252525;
        --nc-border-context: #444444;
        --nc-quote-icon: #333333;
        --nc-text-summary: #aaaaaa;
        
        --nc-label-bg: #1e1e1e;
        --nc-label-text: #cccccc;
        --nc-content-text: #dddddd;
        --nc-link-icon: #666666;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.2);
    }

    .note-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--nc-shadow-hover);
    }

     
    .nc-accent {
        height: 4px;
        background: linear-gradient(90deg, #3a7bd5, #00d2ff); 
        width: 100%;
    }

     
    .nc-header {
        padding: 24px 28px 10px; 
    }

    .nc-meta {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 10px; 
        font-size: 13px; 
        color: var(--nc-meta);
        font-weight: 600;
        letter-spacing: 1px;
        text-transform: uppercase;
    }

    .nc-badge {
        color: var(--nc-badge-text);
        background: var(--nc-badge-bg);
        padding: 2px 6px;
        border-radius: 4px;
    }

    .nc-title {
        display: block;
        font-size: 2rem; 
        font-weight: 700;
        color: var(--nc-title);
        text-decoration: none;
        line-height: 1.3;
        transition: color 0.2s;
    }

    .nc-title:hover {
        color: var(--nc-title-hover);
    }

    .nc-link-icon {
        width: 20px; 
        height: 20px;
        color: var(--nc-link-icon);
        margin-left: 5px;
        vertical-align: middle;
        transition: color 0.2s;
    }

    .nc-title:hover .nc-link-icon {
        color: var(--nc-title-hover);
    }

     
    .nc-context {
        margin: 12px 28px 24px;
        background: var(--nc-bg-context);
        padding: 20px 24px;
        border-radius: 8px;
        position: relative;
        border-left: 4px solid var(--nc-border-context);
        transition: background 0.3s, border-color 0.3s;
    }

    .nc-quote-icon {
        position: absolute;
        top: 8px;
        left: 10px;
        font-family: serif; 
        font-size: 40px;
        line-height: 1;
        color: var(--nc-quote-icon);
        pointer-events: none;
        transition: color 0.3s;
    }

    .nc-summary-text {
        font-size: 1.7rem; 
        color: var(--nc-text-summary);
        line-height: 1.6;
        font-style: italic;
        position: relative;
        z-index: 1;
        padding-left: 15px; 
        transition: color 0.3s;
    }

     
    .nc-body {
        padding: 0 28px 32px;
        position: relative;
    }

     
    .nc-label {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        font-size: 13px; 
        font-weight: 700;
        color: var(--nc-label-text);
        background: var(--nc-label-bg);
        padding-right: 10px;
        margin-bottom: 12px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
        transition: color 0.3s, background 0.3s;
    }

    .nc-content {
        color: var(--nc-content-text);
        font-size: 1.6rem; 
        line-height: 1.75;
        transition: color 0.3s;
    }

     
    .nc-content p { margin-bottom: 1em; }
    .nc-content p:last-child { margin-bottom: 0; }
    
    .nc-content ul { padding-left: 20px; color: inherit; }
    .nc-content li { margin-bottom: 6px; }
&lt;/style&gt;
&lt;h3 id=&#34;chatgpt-開始會用-app-了canvaspotify-直接在對話裡操作&#34;&gt;ChatGPT 開始會用 App 了！Canva、Spotify 直接在對話裡操作
&lt;/h3&gt;&lt;div class=&#34;note-card&#34;&gt;
    &lt;div class=&#34;nc-accent&#34;&gt;&lt;/div&gt;

    &lt;div class=&#34;nc-header&#34;&gt;
        &lt;div class=&#34;nc-meta&#34;&gt;
            &lt;span class=&#34;nc-badge&#34;&gt;READING&lt;/span&gt;
            &lt;span class=&#34;nc-date&#34;&gt;2025-10-09&lt;/span&gt;
        &lt;/div&gt; &lt;a href=&#34;https://agirls.aotter.net/post/64307&#34; target=&#34;_blank&#34; class=&#34;nc-title&#34; title=&#34;访问原文&#34;&gt;
            ChatGPT 開始會用 App 了！Canva、Spotify 直接在對話裡操作
            &lt;svg class=&#34;nc-link-icon&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
        &lt;/a&gt;
    &lt;/div&gt;

    
    &lt;div class=&#34;nc-context&#34;&gt;
        &lt;div class=&#34;nc-quote-icon&#34;&gt;“&lt;/div&gt;
        &lt;div class=&#34;nc-summary-text&#34;&gt;ChatGPT 现在已集成外部应用程序，允许用户在聊天界面内执行任务。您可以要求 ChatGPT 使用 Canva 创建演示文稿，在 Spotify 上创建播放列表，或通过 Booking.com 查找酒店，而无需离开该平台。此更新将 ChatGPT 转变为一个更强大的智能助手，并且很快将添加更多应用程序和功能。&lt;/div&gt;
    &lt;/div&gt;
    

    
    
    
&lt;/div&gt;

&lt;style&gt;
     
    .note-card {
         
        --nc-bg-card: #ffffff;
        --nc-border: rgba(0,0,0,0.04);
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.08);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.12);
        
        --nc-title: #2c3e50;
        --nc-title-hover: #3a7bd5;
        --nc-meta: #999999;
        
        --nc-bg-context: #f8f9fa;
        --nc-border-context: #e2e8f0;
        --nc-quote-icon: #e2e8f0;
        --nc-text-summary: #555555;
        
        --nc-label-bg: #ffffff;
        --nc-label-text: #2d3748;
        --nc-content-text: #2d3748;
        --nc-link-icon: #cbd5e0;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.1);
        --nc-badge-text: #3a7bd5;

        position: relative;
        background: var(--nc-bg-card);
        border-radius: 12px;
        box-shadow: var(--nc-shadow);
        margin: 2.5rem 0;
        overflow: hidden;
        border: 1px solid var(--nc-border);
        font-family: inherit; 
        transition: transform 0.3s ease, box-shadow 0.3s ease, background 0.3s, border-color 0.3s;
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .note-card {
            --nc-bg-card: #1e1e1e;
            --nc-border: #333333;
            --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
            --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
            
            --nc-title: #f0f0f0;
            --nc-meta: #999999;
            
            --nc-bg-context: #252525;
            --nc-border-context: #444444;
            --nc-quote-icon: #333333;
            --nc-text-summary: #aaaaaa;
            
            --nc-label-bg: #1e1e1e;
            --nc-label-text: #cccccc;
            --nc-content-text: #dddddd;
            --nc-link-icon: #666666;
            
            --nc-badge-bg: rgba(58, 123, 213, 0.2);
        }
    }

    html[data-scheme=&#34;dark&#34;] .note-card {
        --nc-bg-card: #1e1e1e;
        --nc-border: #333333;
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
        
        --nc-title: #f0f0f0;
        --nc-meta: #999999;
        
        --nc-bg-context: #252525;
        --nc-border-context: #444444;
        --nc-quote-icon: #333333;
        --nc-text-summary: #aaaaaa;
        
        --nc-label-bg: #1e1e1e;
        --nc-label-text: #cccccc;
        --nc-content-text: #dddddd;
        --nc-link-icon: #666666;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.2);
    }

    .note-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--nc-shadow-hover);
    }

     
    .nc-accent {
        height: 4px;
        background: linear-gradient(90deg, #3a7bd5, #00d2ff); 
        width: 100%;
    }

     
    .nc-header {
        padding: 24px 28px 10px; 
    }

    .nc-meta {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 10px; 
        font-size: 13px; 
        color: var(--nc-meta);
        font-weight: 600;
        letter-spacing: 1px;
        text-transform: uppercase;
    }

    .nc-badge {
        color: var(--nc-badge-text);
        background: var(--nc-badge-bg);
        padding: 2px 6px;
        border-radius: 4px;
    }

    .nc-title {
        display: block;
        font-size: 2rem; 
        font-weight: 700;
        color: var(--nc-title);
        text-decoration: none;
        line-height: 1.3;
        transition: color 0.2s;
    }

    .nc-title:hover {
        color: var(--nc-title-hover);
    }

    .nc-link-icon {
        width: 20px; 
        height: 20px;
        color: var(--nc-link-icon);
        margin-left: 5px;
        vertical-align: middle;
        transition: color 0.2s;
    }

    .nc-title:hover .nc-link-icon {
        color: var(--nc-title-hover);
    }

     
    .nc-context {
        margin: 12px 28px 24px;
        background: var(--nc-bg-context);
        padding: 20px 24px;
        border-radius: 8px;
        position: relative;
        border-left: 4px solid var(--nc-border-context);
        transition: background 0.3s, border-color 0.3s;
    }

    .nc-quote-icon {
        position: absolute;
        top: 8px;
        left: 10px;
        font-family: serif; 
        font-size: 40px;
        line-height: 1;
        color: var(--nc-quote-icon);
        pointer-events: none;
        transition: color 0.3s;
    }

    .nc-summary-text {
        font-size: 1.7rem; 
        color: var(--nc-text-summary);
        line-height: 1.6;
        font-style: italic;
        position: relative;
        z-index: 1;
        padding-left: 15px; 
        transition: color 0.3s;
    }

     
    .nc-body {
        padding: 0 28px 32px;
        position: relative;
    }

     
    .nc-label {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        font-size: 13px; 
        font-weight: 700;
        color: var(--nc-label-text);
        background: var(--nc-label-bg);
        padding-right: 10px;
        margin-bottom: 12px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
        transition: color 0.3s, background 0.3s;
    }

    .nc-content {
        color: var(--nc-content-text);
        font-size: 1.6rem; 
        line-height: 1.75;
        transition: color 0.3s;
    }

     
    .nc-content p { margin-bottom: 1em; }
    .nc-content p:last-child { margin-bottom: 0; }
    
    .nc-content ul { padding-left: 20px; color: inherit; }
    .nc-content li { margin-bottom: 6px; }
&lt;/style&gt;
&lt;h3 id=&#34;详解2025诺贝尔生理学或医学奖他们发现了人体自我保护的安全卫士为癌症自身免疫病的新疗法奠定基础&#34;&gt;详解2025诺贝尔生理学或医学奖：他们发现了人体自我保护的“安全卫士”，为癌症、自身免疫病的新疗法奠定基础
&lt;/h3&gt;&lt;div class=&#34;note-card&#34;&gt;
    &lt;div class=&#34;nc-accent&#34;&gt;&lt;/div&gt;

    &lt;div class=&#34;nc-header&#34;&gt;
        &lt;div class=&#34;nc-meta&#34;&gt;
            &lt;span class=&#34;nc-badge&#34;&gt;READING&lt;/span&gt;
            &lt;span class=&#34;nc-date&#34;&gt;2025-10-09&lt;/span&gt;
        &lt;/div&gt; &lt;a href=&#34;http://mp.weixin.qq.com/s?__biz=MjM5NDA1Njg2MA==&amp;amp;mid=2652088419&amp;amp;idx=1&amp;amp;sn=166888ebcdd6720ea8ef7c285bd522da&amp;amp;chksm=bc1c56879b1e278ef99be387e740b383b170f8f0c1eb8d9be09c5c4742b97f20b811fb25fcc9&amp;amp;scene=0&amp;amp;xtrack=1#rd&#34; target=&#34;_blank&#34; class=&#34;nc-title&#34; title=&#34;访问原文&#34;&gt;
            详解2025诺贝尔生理学或医学奖：他们发现了人体自我保护的“安全卫士”，为癌症、自身免疫病的新疗法奠定基础
            &lt;svg class=&#34;nc-link-icon&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
        &lt;/a&gt;
    &lt;/div&gt;

    
    &lt;div class=&#34;nc-context&#34;&gt;
        &lt;div class=&#34;nc-quote-icon&#34;&gt;“&lt;/div&gt;
        &lt;div class=&#34;nc-summary-text&#34;&gt;两位美国科学家玛丽·E·布伦科（Mary E. Brunkow）和弗雷德·拉姆斯代尔（Fred Ramsdell），以及一位日本科学家坂巻（Sakamaki），荣获2025年诺贝尔生理学或医学奖。他们开创性的研究发现了保护人体免受疾病侵害的“安全卫士”。这项发现为治疗癌症和自身免疫性疾病等疾病的创新疗法奠定了基础。&lt;/div&gt;
    &lt;/div&gt;
    

    
    
    
&lt;/div&gt;

&lt;style&gt;
     
    .note-card {
         
        --nc-bg-card: #ffffff;
        --nc-border: rgba(0,0,0,0.04);
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.08);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.12);
        
        --nc-title: #2c3e50;
        --nc-title-hover: #3a7bd5;
        --nc-meta: #999999;
        
        --nc-bg-context: #f8f9fa;
        --nc-border-context: #e2e8f0;
        --nc-quote-icon: #e2e8f0;
        --nc-text-summary: #555555;
        
        --nc-label-bg: #ffffff;
        --nc-label-text: #2d3748;
        --nc-content-text: #2d3748;
        --nc-link-icon: #cbd5e0;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.1);
        --nc-badge-text: #3a7bd5;

        position: relative;
        background: var(--nc-bg-card);
        border-radius: 12px;
        box-shadow: var(--nc-shadow);
        margin: 2.5rem 0;
        overflow: hidden;
        border: 1px solid var(--nc-border);
        font-family: inherit; 
        transition: transform 0.3s ease, box-shadow 0.3s ease, background 0.3s, border-color 0.3s;
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .note-card {
            --nc-bg-card: #1e1e1e;
            --nc-border: #333333;
            --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
            --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
            
            --nc-title: #f0f0f0;
            --nc-meta: #999999;
            
            --nc-bg-context: #252525;
            --nc-border-context: #444444;
            --nc-quote-icon: #333333;
            --nc-text-summary: #aaaaaa;
            
            --nc-label-bg: #1e1e1e;
            --nc-label-text: #cccccc;
            --nc-content-text: #dddddd;
            --nc-link-icon: #666666;
            
            --nc-badge-bg: rgba(58, 123, 213, 0.2);
        }
    }

    html[data-scheme=&#34;dark&#34;] .note-card {
        --nc-bg-card: #1e1e1e;
        --nc-border: #333333;
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
        
        --nc-title: #f0f0f0;
        --nc-meta: #999999;
        
        --nc-bg-context: #252525;
        --nc-border-context: #444444;
        --nc-quote-icon: #333333;
        --nc-text-summary: #aaaaaa;
        
        --nc-label-bg: #1e1e1e;
        --nc-label-text: #cccccc;
        --nc-content-text: #dddddd;
        --nc-link-icon: #666666;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.2);
    }

    .note-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--nc-shadow-hover);
    }

     
    .nc-accent {
        height: 4px;
        background: linear-gradient(90deg, #3a7bd5, #00d2ff); 
        width: 100%;
    }

     
    .nc-header {
        padding: 24px 28px 10px; 
    }

    .nc-meta {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 10px; 
        font-size: 13px; 
        color: var(--nc-meta);
        font-weight: 600;
        letter-spacing: 1px;
        text-transform: uppercase;
    }

    .nc-badge {
        color: var(--nc-badge-text);
        background: var(--nc-badge-bg);
        padding: 2px 6px;
        border-radius: 4px;
    }

    .nc-title {
        display: block;
        font-size: 2rem; 
        font-weight: 700;
        color: var(--nc-title);
        text-decoration: none;
        line-height: 1.3;
        transition: color 0.2s;
    }

    .nc-title:hover {
        color: var(--nc-title-hover);
    }

    .nc-link-icon {
        width: 20px; 
        height: 20px;
        color: var(--nc-link-icon);
        margin-left: 5px;
        vertical-align: middle;
        transition: color 0.2s;
    }

    .nc-title:hover .nc-link-icon {
        color: var(--nc-title-hover);
    }

     
    .nc-context {
        margin: 12px 28px 24px;
        background: var(--nc-bg-context);
        padding: 20px 24px;
        border-radius: 8px;
        position: relative;
        border-left: 4px solid var(--nc-border-context);
        transition: background 0.3s, border-color 0.3s;
    }

    .nc-quote-icon {
        position: absolute;
        top: 8px;
        left: 10px;
        font-family: serif; 
        font-size: 40px;
        line-height: 1;
        color: var(--nc-quote-icon);
        pointer-events: none;
        transition: color 0.3s;
    }

    .nc-summary-text {
        font-size: 1.7rem; 
        color: var(--nc-text-summary);
        line-height: 1.6;
        font-style: italic;
        position: relative;
        z-index: 1;
        padding-left: 15px; 
        transition: color 0.3s;
    }

     
    .nc-body {
        padding: 0 28px 32px;
        position: relative;
    }

     
    .nc-label {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        font-size: 13px; 
        font-weight: 700;
        color: var(--nc-label-text);
        background: var(--nc-label-bg);
        padding-right: 10px;
        margin-bottom: 12px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
        transition: color 0.3s, background 0.3s;
    }

    .nc-content {
        color: var(--nc-content-text);
        font-size: 1.6rem; 
        line-height: 1.75;
        transition: color 0.3s;
    }

     
    .nc-content p { margin-bottom: 1em; }
    .nc-content p:last-child { margin-bottom: 0; }
    
    .nc-content ul { padding-left: 20px; color: inherit; }
    .nc-content li { margin-bottom: 6px; }
&lt;/style&gt;
&lt;h3 id=&#34;回归本行的诺贝尔化学奖今年颁给了开发金属有机骨架的三位科学家&#34;&gt;回归“本行”的诺贝尔化学奖，今年颁给了开发金属有机骨架的三位科学家
&lt;/h3&gt;&lt;div class=&#34;note-card&#34;&gt;
    &lt;div class=&#34;nc-accent&#34;&gt;&lt;/div&gt;

    &lt;div class=&#34;nc-header&#34;&gt;
        &lt;div class=&#34;nc-meta&#34;&gt;
            &lt;span class=&#34;nc-badge&#34;&gt;READING&lt;/span&gt;
            &lt;span class=&#34;nc-date&#34;&gt;2025-10-09&lt;/span&gt;
        &lt;/div&gt; &lt;a href=&#34;http://www.toodaylab.com/83737&#34; target=&#34;_blank&#34; class=&#34;nc-title&#34; title=&#34;访问原文&#34;&gt;
            回归“本行”的诺贝尔化学奖，今年颁给了开发金属有机骨架的三位科学家
            &lt;svg class=&#34;nc-link-icon&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
        &lt;/a&gt;
    &lt;/div&gt;

    
    &lt;div class=&#34;nc-context&#34;&gt;
        &lt;div class=&#34;nc-quote-icon&#34;&gt;“&lt;/div&gt;
        &lt;div class=&#34;nc-summary-text&#34;&gt;2023年诺贝尔化学奖授予了北川进（Susumu Kitagawa）、理查德·罗布森（Richard Robson）和奥马尔·M·亚基（Omar M. Yaghi），以表彰他们在金属有机框架（MOFs）开发方面所做的开创性工作。MOFs是具有多孔结构的结晶材料，能够储存和运输气体及其他化学物质。它们的开发在环境清理和集水等领域取得了重大进展，展示了这一“纯化学”领域的创新潜力。&lt;/div&gt;
    &lt;/div&gt;
    

    
    
    
&lt;/div&gt;

&lt;style&gt;
     
    .note-card {
         
        --nc-bg-card: #ffffff;
        --nc-border: rgba(0,0,0,0.04);
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.08);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.12);
        
        --nc-title: #2c3e50;
        --nc-title-hover: #3a7bd5;
        --nc-meta: #999999;
        
        --nc-bg-context: #f8f9fa;
        --nc-border-context: #e2e8f0;
        --nc-quote-icon: #e2e8f0;
        --nc-text-summary: #555555;
        
        --nc-label-bg: #ffffff;
        --nc-label-text: #2d3748;
        --nc-content-text: #2d3748;
        --nc-link-icon: #cbd5e0;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.1);
        --nc-badge-text: #3a7bd5;

        position: relative;
        background: var(--nc-bg-card);
        border-radius: 12px;
        box-shadow: var(--nc-shadow);
        margin: 2.5rem 0;
        overflow: hidden;
        border: 1px solid var(--nc-border);
        font-family: inherit; 
        transition: transform 0.3s ease, box-shadow 0.3s ease, background 0.3s, border-color 0.3s;
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .note-card {
            --nc-bg-card: #1e1e1e;
            --nc-border: #333333;
            --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
            --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
            
            --nc-title: #f0f0f0;
            --nc-meta: #999999;
            
            --nc-bg-context: #252525;
            --nc-border-context: #444444;
            --nc-quote-icon: #333333;
            --nc-text-summary: #aaaaaa;
            
            --nc-label-bg: #1e1e1e;
            --nc-label-text: #cccccc;
            --nc-content-text: #dddddd;
            --nc-link-icon: #666666;
            
            --nc-badge-bg: rgba(58, 123, 213, 0.2);
        }
    }

    html[data-scheme=&#34;dark&#34;] .note-card {
        --nc-bg-card: #1e1e1e;
        --nc-border: #333333;
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
        
        --nc-title: #f0f0f0;
        --nc-meta: #999999;
        
        --nc-bg-context: #252525;
        --nc-border-context: #444444;
        --nc-quote-icon: #333333;
        --nc-text-summary: #aaaaaa;
        
        --nc-label-bg: #1e1e1e;
        --nc-label-text: #cccccc;
        --nc-content-text: #dddddd;
        --nc-link-icon: #666666;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.2);
    }

    .note-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--nc-shadow-hover);
    }

     
    .nc-accent {
        height: 4px;
        background: linear-gradient(90deg, #3a7bd5, #00d2ff); 
        width: 100%;
    }

     
    .nc-header {
        padding: 24px 28px 10px; 
    }

    .nc-meta {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 10px; 
        font-size: 13px; 
        color: var(--nc-meta);
        font-weight: 600;
        letter-spacing: 1px;
        text-transform: uppercase;
    }

    .nc-badge {
        color: var(--nc-badge-text);
        background: var(--nc-badge-bg);
        padding: 2px 6px;
        border-radius: 4px;
    }

    .nc-title {
        display: block;
        font-size: 2rem; 
        font-weight: 700;
        color: var(--nc-title);
        text-decoration: none;
        line-height: 1.3;
        transition: color 0.2s;
    }

    .nc-title:hover {
        color: var(--nc-title-hover);
    }

    .nc-link-icon {
        width: 20px; 
        height: 20px;
        color: var(--nc-link-icon);
        margin-left: 5px;
        vertical-align: middle;
        transition: color 0.2s;
    }

    .nc-title:hover .nc-link-icon {
        color: var(--nc-title-hover);
    }

     
    .nc-context {
        margin: 12px 28px 24px;
        background: var(--nc-bg-context);
        padding: 20px 24px;
        border-radius: 8px;
        position: relative;
        border-left: 4px solid var(--nc-border-context);
        transition: background 0.3s, border-color 0.3s;
    }

    .nc-quote-icon {
        position: absolute;
        top: 8px;
        left: 10px;
        font-family: serif; 
        font-size: 40px;
        line-height: 1;
        color: var(--nc-quote-icon);
        pointer-events: none;
        transition: color 0.3s;
    }

    .nc-summary-text {
        font-size: 1.7rem; 
        color: var(--nc-text-summary);
        line-height: 1.6;
        font-style: italic;
        position: relative;
        z-index: 1;
        padding-left: 15px; 
        transition: color 0.3s;
    }

     
    .nc-body {
        padding: 0 28px 32px;
        position: relative;
    }

     
    .nc-label {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        font-size: 13px; 
        font-weight: 700;
        color: var(--nc-label-text);
        background: var(--nc-label-bg);
        padding-right: 10px;
        margin-bottom: 12px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
        transition: color 0.3s, background 0.3s;
    }

    .nc-content {
        color: var(--nc-content-text);
        font-size: 1.6rem; 
        line-height: 1.75;
        transition: color 0.3s;
    }

     
    .nc-content p { margin-bottom: 1em; }
    .nc-content p:last-child { margin-bottom: 0; }
    
    .nc-content ul { padding-left: 20px; color: inherit; }
    .nc-content li { margin-bottom: 6px; }
&lt;/style&gt;
&lt;h3 id=&#34;the-women-artists-who-found-freedom-in-old-age-晚年获得自由的女性艺术家&#34;&gt;The Women Artists Who Found Freedom in Old Age 晚年获得自由的女性艺术家
&lt;/h3&gt;&lt;div class=&#34;note-card&#34;&gt;
    &lt;div class=&#34;nc-accent&#34;&gt;&lt;/div&gt;

    &lt;div class=&#34;nc-header&#34;&gt;
        &lt;div class=&#34;nc-meta&#34;&gt;
            &lt;span class=&#34;nc-badge&#34;&gt;READING&lt;/span&gt;
            &lt;span class=&#34;nc-date&#34;&gt;2025-10-09&lt;/span&gt;
        &lt;/div&gt; &lt;a href=&#34;https://hyperallergic.com/1047386/women-artists-who-found-freedom-in-old-age-grand-finales-susan-gunbar/&#34; target=&#34;_blank&#34; class=&#34;nc-title&#34; title=&#34;访问原文&#34;&gt;
            The Women Artists Who Found Freedom in Old Age 晚年获得自由的女性艺术家
            &lt;svg class=&#34;nc-link-icon&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
        &lt;/a&gt;
    &lt;/div&gt;

    
    &lt;div class=&#34;nc-context&#34;&gt;
        &lt;div class=&#34;nc-quote-icon&#34;&gt;“&lt;/div&gt;
        &lt;div class=&#34;nc-summary-text&#34;&gt;苏珊·古巴尔的《大结局》探讨了女性艺术家，如路易丝·布尔乔亚和乔治亚·奥基夫，如何在晚年找到自由并创作出最具创新的作品。摆脱了社会束缚，这些艺术家重塑了自我，汲取了人际关系、独特的感受力或社会正义事业的灵感。古巴尔强调了她们的适应能力和实现全部潜力的动力，证明了创造力可以在一生中蓬勃发展，即使在失去之后。&lt;/div&gt;
    &lt;/div&gt;
    

    
    
    
&lt;/div&gt;

&lt;style&gt;
     
    .note-card {
         
        --nc-bg-card: #ffffff;
        --nc-border: rgba(0,0,0,0.04);
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.08);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.12);
        
        --nc-title: #2c3e50;
        --nc-title-hover: #3a7bd5;
        --nc-meta: #999999;
        
        --nc-bg-context: #f8f9fa;
        --nc-border-context: #e2e8f0;
        --nc-quote-icon: #e2e8f0;
        --nc-text-summary: #555555;
        
        --nc-label-bg: #ffffff;
        --nc-label-text: #2d3748;
        --nc-content-text: #2d3748;
        --nc-link-icon: #cbd5e0;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.1);
        --nc-badge-text: #3a7bd5;

        position: relative;
        background: var(--nc-bg-card);
        border-radius: 12px;
        box-shadow: var(--nc-shadow);
        margin: 2.5rem 0;
        overflow: hidden;
        border: 1px solid var(--nc-border);
        font-family: inherit; 
        transition: transform 0.3s ease, box-shadow 0.3s ease, background 0.3s, border-color 0.3s;
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .note-card {
            --nc-bg-card: #1e1e1e;
            --nc-border: #333333;
            --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
            --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
            
            --nc-title: #f0f0f0;
            --nc-meta: #999999;
            
            --nc-bg-context: #252525;
            --nc-border-context: #444444;
            --nc-quote-icon: #333333;
            --nc-text-summary: #aaaaaa;
            
            --nc-label-bg: #1e1e1e;
            --nc-label-text: #cccccc;
            --nc-content-text: #dddddd;
            --nc-link-icon: #666666;
            
            --nc-badge-bg: rgba(58, 123, 213, 0.2);
        }
    }

    html[data-scheme=&#34;dark&#34;] .note-card {
        --nc-bg-card: #1e1e1e;
        --nc-border: #333333;
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
        
        --nc-title: #f0f0f0;
        --nc-meta: #999999;
        
        --nc-bg-context: #252525;
        --nc-border-context: #444444;
        --nc-quote-icon: #333333;
        --nc-text-summary: #aaaaaa;
        
        --nc-label-bg: #1e1e1e;
        --nc-label-text: #cccccc;
        --nc-content-text: #dddddd;
        --nc-link-icon: #666666;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.2);
    }

    .note-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--nc-shadow-hover);
    }

     
    .nc-accent {
        height: 4px;
        background: linear-gradient(90deg, #3a7bd5, #00d2ff); 
        width: 100%;
    }

     
    .nc-header {
        padding: 24px 28px 10px; 
    }

    .nc-meta {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 10px; 
        font-size: 13px; 
        color: var(--nc-meta);
        font-weight: 600;
        letter-spacing: 1px;
        text-transform: uppercase;
    }

    .nc-badge {
        color: var(--nc-badge-text);
        background: var(--nc-badge-bg);
        padding: 2px 6px;
        border-radius: 4px;
    }

    .nc-title {
        display: block;
        font-size: 2rem; 
        font-weight: 700;
        color: var(--nc-title);
        text-decoration: none;
        line-height: 1.3;
        transition: color 0.2s;
    }

    .nc-title:hover {
        color: var(--nc-title-hover);
    }

    .nc-link-icon {
        width: 20px; 
        height: 20px;
        color: var(--nc-link-icon);
        margin-left: 5px;
        vertical-align: middle;
        transition: color 0.2s;
    }

    .nc-title:hover .nc-link-icon {
        color: var(--nc-title-hover);
    }

     
    .nc-context {
        margin: 12px 28px 24px;
        background: var(--nc-bg-context);
        padding: 20px 24px;
        border-radius: 8px;
        position: relative;
        border-left: 4px solid var(--nc-border-context);
        transition: background 0.3s, border-color 0.3s;
    }

    .nc-quote-icon {
        position: absolute;
        top: 8px;
        left: 10px;
        font-family: serif; 
        font-size: 40px;
        line-height: 1;
        color: var(--nc-quote-icon);
        pointer-events: none;
        transition: color 0.3s;
    }

    .nc-summary-text {
        font-size: 1.7rem; 
        color: var(--nc-text-summary);
        line-height: 1.6;
        font-style: italic;
        position: relative;
        z-index: 1;
        padding-left: 15px; 
        transition: color 0.3s;
    }

     
    .nc-body {
        padding: 0 28px 32px;
        position: relative;
    }

     
    .nc-label {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        font-size: 13px; 
        font-weight: 700;
        color: var(--nc-label-text);
        background: var(--nc-label-bg);
        padding-right: 10px;
        margin-bottom: 12px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
        transition: color 0.3s, background 0.3s;
    }

    .nc-content {
        color: var(--nc-content-text);
        font-size: 1.6rem; 
        line-height: 1.75;
        transition: color 0.3s;
    }

     
    .nc-content p { margin-bottom: 1em; }
    .nc-content p:last-child { margin-bottom: 0; }
    
    .nc-content ul { padding-left: 20px; color: inherit; }
    .nc-content li { margin-bottom: 6px; }
&lt;/style&gt;
&lt;h3 id=&#34;portrait-of-enslaved-man-dispels-years-of-falsehoods-被奴役男子画像驱散多年谎言&#34;&gt;Portrait of Enslaved Man Dispels Years of Falsehoods 被奴役男子画像驱散多年谎言
&lt;/h3&gt;&lt;div class=&#34;note-card&#34;&gt;
    &lt;div class=&#34;nc-accent&#34;&gt;&lt;/div&gt;

    &lt;div class=&#34;nc-header&#34;&gt;
        &lt;div class=&#34;nc-meta&#34;&gt;
            &lt;span class=&#34;nc-badge&#34;&gt;READING&lt;/span&gt;
            &lt;span class=&#34;nc-date&#34;&gt;2025-10-09&lt;/span&gt;
        &lt;/div&gt; &lt;a href=&#34;https://hyperallergic.com/1047386/women-artists-who-found-freedom-in-old-age-grand-finales-susan-gunbar/&#34; target=&#34;_blank&#34; class=&#34;nc-title&#34; title=&#34;访问原文&#34;&gt;
            Portrait of Enslaved Man Dispels Years of Falsehoods 被奴役男子画像驱散多年谎言
            &lt;svg class=&#34;nc-link-icon&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
        &lt;/a&gt;
    &lt;/div&gt;

    
    &lt;div class=&#34;nc-context&#34;&gt;
        &lt;div class=&#34;nc-quote-icon&#34;&gt;“&lt;/div&gt;
        &lt;div class=&#34;nc-summary-text&#34;&gt;关于弗雷德里克·贝克（一名被奴役的男子）一幅罕见的 19 世纪肖像的新研究揭示了他生活的残酷现实。历史学家们发现了证明长木庄园过去宣扬的浪漫化和虚假叙述不成立的证据。这幅画曾被认为描绘的是一位服从的管家，但实际上它代表了贝克及其家人在奴役期间一生遭受的暴力和非人待遇。这件艺术品现已展出，提供了他历史的真实记载。&lt;/div&gt;
    &lt;/div&gt;
    

    
    
    
&lt;/div&gt;

&lt;style&gt;
     
    .note-card {
         
        --nc-bg-card: #ffffff;
        --nc-border: rgba(0,0,0,0.04);
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.08);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.12);
        
        --nc-title: #2c3e50;
        --nc-title-hover: #3a7bd5;
        --nc-meta: #999999;
        
        --nc-bg-context: #f8f9fa;
        --nc-border-context: #e2e8f0;
        --nc-quote-icon: #e2e8f0;
        --nc-text-summary: #555555;
        
        --nc-label-bg: #ffffff;
        --nc-label-text: #2d3748;
        --nc-content-text: #2d3748;
        --nc-link-icon: #cbd5e0;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.1);
        --nc-badge-text: #3a7bd5;

        position: relative;
        background: var(--nc-bg-card);
        border-radius: 12px;
        box-shadow: var(--nc-shadow);
        margin: 2.5rem 0;
        overflow: hidden;
        border: 1px solid var(--nc-border);
        font-family: inherit; 
        transition: transform 0.3s ease, box-shadow 0.3s ease, background 0.3s, border-color 0.3s;
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .note-card {
            --nc-bg-card: #1e1e1e;
            --nc-border: #333333;
            --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
            --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
            
            --nc-title: #f0f0f0;
            --nc-meta: #999999;
            
            --nc-bg-context: #252525;
            --nc-border-context: #444444;
            --nc-quote-icon: #333333;
            --nc-text-summary: #aaaaaa;
            
            --nc-label-bg: #1e1e1e;
            --nc-label-text: #cccccc;
            --nc-content-text: #dddddd;
            --nc-link-icon: #666666;
            
            --nc-badge-bg: rgba(58, 123, 213, 0.2);
        }
    }

    html[data-scheme=&#34;dark&#34;] .note-card {
        --nc-bg-card: #1e1e1e;
        --nc-border: #333333;
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
        
        --nc-title: #f0f0f0;
        --nc-meta: #999999;
        
        --nc-bg-context: #252525;
        --nc-border-context: #444444;
        --nc-quote-icon: #333333;
        --nc-text-summary: #aaaaaa;
        
        --nc-label-bg: #1e1e1e;
        --nc-label-text: #cccccc;
        --nc-content-text: #dddddd;
        --nc-link-icon: #666666;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.2);
    }

    .note-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--nc-shadow-hover);
    }

     
    .nc-accent {
        height: 4px;
        background: linear-gradient(90deg, #3a7bd5, #00d2ff); 
        width: 100%;
    }

     
    .nc-header {
        padding: 24px 28px 10px; 
    }

    .nc-meta {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 10px; 
        font-size: 13px; 
        color: var(--nc-meta);
        font-weight: 600;
        letter-spacing: 1px;
        text-transform: uppercase;
    }

    .nc-badge {
        color: var(--nc-badge-text);
        background: var(--nc-badge-bg);
        padding: 2px 6px;
        border-radius: 4px;
    }

    .nc-title {
        display: block;
        font-size: 2rem; 
        font-weight: 700;
        color: var(--nc-title);
        text-decoration: none;
        line-height: 1.3;
        transition: color 0.2s;
    }

    .nc-title:hover {
        color: var(--nc-title-hover);
    }

    .nc-link-icon {
        width: 20px; 
        height: 20px;
        color: var(--nc-link-icon);
        margin-left: 5px;
        vertical-align: middle;
        transition: color 0.2s;
    }

    .nc-title:hover .nc-link-icon {
        color: var(--nc-title-hover);
    }

     
    .nc-context {
        margin: 12px 28px 24px;
        background: var(--nc-bg-context);
        padding: 20px 24px;
        border-radius: 8px;
        position: relative;
        border-left: 4px solid var(--nc-border-context);
        transition: background 0.3s, border-color 0.3s;
    }

    .nc-quote-icon {
        position: absolute;
        top: 8px;
        left: 10px;
        font-family: serif; 
        font-size: 40px;
        line-height: 1;
        color: var(--nc-quote-icon);
        pointer-events: none;
        transition: color 0.3s;
    }

    .nc-summary-text {
        font-size: 1.7rem; 
        color: var(--nc-text-summary);
        line-height: 1.6;
        font-style: italic;
        position: relative;
        z-index: 1;
        padding-left: 15px; 
        transition: color 0.3s;
    }

     
    .nc-body {
        padding: 0 28px 32px;
        position: relative;
    }

     
    .nc-label {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        font-size: 13px; 
        font-weight: 700;
        color: var(--nc-label-text);
        background: var(--nc-label-bg);
        padding-right: 10px;
        margin-bottom: 12px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
        transition: color 0.3s, background 0.3s;
    }

    .nc-content {
        color: var(--nc-content-text);
        font-size: 1.6rem; 
        line-height: 1.75;
        transition: color 0.3s;
    }

     
    .nc-content p { margin-bottom: 1em; }
    .nc-content p:last-child { margin-bottom: 0; }
    
    .nc-content ul { padding-left: 20px; color: inherit; }
    .nc-content li { margin-bottom: 6px; }
&lt;/style&gt;
&lt;p&gt;&lt;img src=&#34;https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A2025%E5%B9%B4%E7%AC%AC31-32%E6%9C%9F%E5%90%88%E5%88%8A%E6%80%BB%E7%AC%AC31-32%E6%9C%9F/20251009-Picture01.jpg&#34;
	width=&#34;895&#34;
	height=&#34;1024&#34;
	srcset=&#34;https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A2025%E5%B9%B4%E7%AC%AC31-32%E6%9C%9F%E5%90%88%E5%88%8A%E6%80%BB%E7%AC%AC31-32%E6%9C%9F/20251009-Picture01_hu_a949b310b33dc80d.jpg 480w, https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A2025%E5%B9%B4%E7%AC%AC31-32%E6%9C%9F%E5%90%88%E5%88%8A%E6%80%BB%E7%AC%AC31-32%E6%9C%9F/20251009-Picture01_hu_3b1727e8d0509dcf.jpg 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;Attributed to the artist C.R. Parker，the 19th-century oil painting “Portrait of Frederick” (c. 1840) is thought to be one of two known portraits depicting enslaved individuals in Mississippi. It was acquired as a joint partnership between the Crystal Bridges museum and the Mississippi Museum of Art (MMA)，which holds “Portrait of Delia” (ca. 1840-1849) by James Reid Lambdin. The purchase was made in April from Neal Auction Company in New Orleans for $508，750.这幅 19 世纪的油画《弗雷德里克肖像》（约 1840 年）归功于艺术家 C.R. Parker，据信是仅有的两幅描绘密西西比州被奴役者的肖像画之一。这幅画由 Crystal Bridges 博物馆和密西西比艺术博物馆 (MMA) 联合收购，后者收藏有 James Reid Lambdin 的《黛莉娅肖像》（约 1840-1849 年）。该画作于 4 月份从新奥尔良的 Neal Auction Company 以 508，750 美元的价格购得&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;87&#34;
		data-flex-basis=&#34;209px&#34;
	
&gt;&lt;/p&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-9&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        For decades，the truth about Frederick Baker’s life under enslavement was enshrouded in a whitewashed history perpetuated by the local historians of Longwood mansion in Natchez，Mississippi. Now，new research on a rare pre-Emancipation artwork that has long been on display at the historic house museum has unearthed Baker’s story，dispelling years of false narratives that dignified the reputations of his White enslavers.
    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-9&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-10&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        “Portrait of Frederick” is currently on display at the MMA through December 1 in the temporary exhibition Figments，which explores the historically fraught positions of Black subjects in visual art. In May 2026，the painting will travel to Crystal Bridges for one year，and subsequently alternate between the two museums based on three-year terms.
    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-10&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;
&lt;h3 id=&#34;irish-novelist-naoise-dolan-has-been-abducted-by-israel-爱尔兰小说家-naoise-dolan-被以色列绑架&#34;&gt;Irish Novelist Naoise Dolan Has Been Abducted by Israel. 爱尔兰小说家 Naoise Dolan 被以色列绑架。
&lt;/h3&gt;&lt;div class=&#34;note-card&#34;&gt;
    &lt;div class=&#34;nc-accent&#34;&gt;&lt;/div&gt;

    &lt;div class=&#34;nc-header&#34;&gt;
        &lt;div class=&#34;nc-meta&#34;&gt;
            &lt;span class=&#34;nc-badge&#34;&gt;READING&lt;/span&gt;
            &lt;span class=&#34;nc-date&#34;&gt;2025-10-09&lt;/span&gt;
        &lt;/div&gt; &lt;a href=&#34;https://lithub.com/irish-novelist-naoise-dolan-has-been-abducted-by-israel/&#34; target=&#34;_blank&#34; class=&#34;nc-title&#34; title=&#34;访问原文&#34;&gt;
            Irish Novelist Naoise Dolan Has Been Abducted by Israel. 爱尔兰小说家 Naoise Dolan 被以色列绑架。
            &lt;svg class=&#34;nc-link-icon&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
        &lt;/a&gt;
    &lt;/div&gt;

    
    &lt;div class=&#34;nc-context&#34;&gt;
        &lt;div class=&#34;nc-quote-icon&#34;&gt;“&lt;/div&gt;
        &lt;div class=&#34;nc-summary-text&#34;&gt;爱尔兰小说家诺伊斯·多兰在她的援助船队（前往加沙途中）被拦截后，被以色列部队绑架。 《精彩的时光》的作者多兰在一则视频中表示，她是违背意愿被带走的，并呼吁联系她的政府以获得释放。她参加了一项非暴力人道主义任务，旨在挑战以色列的封锁。&lt;/div&gt;
    &lt;/div&gt;
    

    
    
    
&lt;/div&gt;

&lt;style&gt;
     
    .note-card {
         
        --nc-bg-card: #ffffff;
        --nc-border: rgba(0,0,0,0.04);
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.08);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.12);
        
        --nc-title: #2c3e50;
        --nc-title-hover: #3a7bd5;
        --nc-meta: #999999;
        
        --nc-bg-context: #f8f9fa;
        --nc-border-context: #e2e8f0;
        --nc-quote-icon: #e2e8f0;
        --nc-text-summary: #555555;
        
        --nc-label-bg: #ffffff;
        --nc-label-text: #2d3748;
        --nc-content-text: #2d3748;
        --nc-link-icon: #cbd5e0;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.1);
        --nc-badge-text: #3a7bd5;

        position: relative;
        background: var(--nc-bg-card);
        border-radius: 12px;
        box-shadow: var(--nc-shadow);
        margin: 2.5rem 0;
        overflow: hidden;
        border: 1px solid var(--nc-border);
        font-family: inherit; 
        transition: transform 0.3s ease, box-shadow 0.3s ease, background 0.3s, border-color 0.3s;
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .note-card {
            --nc-bg-card: #1e1e1e;
            --nc-border: #333333;
            --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
            --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
            
            --nc-title: #f0f0f0;
            --nc-meta: #999999;
            
            --nc-bg-context: #252525;
            --nc-border-context: #444444;
            --nc-quote-icon: #333333;
            --nc-text-summary: #aaaaaa;
            
            --nc-label-bg: #1e1e1e;
            --nc-label-text: #cccccc;
            --nc-content-text: #dddddd;
            --nc-link-icon: #666666;
            
            --nc-badge-bg: rgba(58, 123, 213, 0.2);
        }
    }

    html[data-scheme=&#34;dark&#34;] .note-card {
        --nc-bg-card: #1e1e1e;
        --nc-border: #333333;
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
        
        --nc-title: #f0f0f0;
        --nc-meta: #999999;
        
        --nc-bg-context: #252525;
        --nc-border-context: #444444;
        --nc-quote-icon: #333333;
        --nc-text-summary: #aaaaaa;
        
        --nc-label-bg: #1e1e1e;
        --nc-label-text: #cccccc;
        --nc-content-text: #dddddd;
        --nc-link-icon: #666666;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.2);
    }

    .note-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--nc-shadow-hover);
    }

     
    .nc-accent {
        height: 4px;
        background: linear-gradient(90deg, #3a7bd5, #00d2ff); 
        width: 100%;
    }

     
    .nc-header {
        padding: 24px 28px 10px; 
    }

    .nc-meta {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 10px; 
        font-size: 13px; 
        color: var(--nc-meta);
        font-weight: 600;
        letter-spacing: 1px;
        text-transform: uppercase;
    }

    .nc-badge {
        color: var(--nc-badge-text);
        background: var(--nc-badge-bg);
        padding: 2px 6px;
        border-radius: 4px;
    }

    .nc-title {
        display: block;
        font-size: 2rem; 
        font-weight: 700;
        color: var(--nc-title);
        text-decoration: none;
        line-height: 1.3;
        transition: color 0.2s;
    }

    .nc-title:hover {
        color: var(--nc-title-hover);
    }

    .nc-link-icon {
        width: 20px; 
        height: 20px;
        color: var(--nc-link-icon);
        margin-left: 5px;
        vertical-align: middle;
        transition: color 0.2s;
    }

    .nc-title:hover .nc-link-icon {
        color: var(--nc-title-hover);
    }

     
    .nc-context {
        margin: 12px 28px 24px;
        background: var(--nc-bg-context);
        padding: 20px 24px;
        border-radius: 8px;
        position: relative;
        border-left: 4px solid var(--nc-border-context);
        transition: background 0.3s, border-color 0.3s;
    }

    .nc-quote-icon {
        position: absolute;
        top: 8px;
        left: 10px;
        font-family: serif; 
        font-size: 40px;
        line-height: 1;
        color: var(--nc-quote-icon);
        pointer-events: none;
        transition: color 0.3s;
    }

    .nc-summary-text {
        font-size: 1.7rem; 
        color: var(--nc-text-summary);
        line-height: 1.6;
        font-style: italic;
        position: relative;
        z-index: 1;
        padding-left: 15px; 
        transition: color 0.3s;
    }

     
    .nc-body {
        padding: 0 28px 32px;
        position: relative;
    }

     
    .nc-label {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        font-size: 13px; 
        font-weight: 700;
        color: var(--nc-label-text);
        background: var(--nc-label-bg);
        padding-right: 10px;
        margin-bottom: 12px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
        transition: color 0.3s, background 0.3s;
    }

    .nc-content {
        color: var(--nc-content-text);
        font-size: 1.6rem; 
        line-height: 1.75;
        transition: color 0.3s;
    }

     
    .nc-content p { margin-bottom: 1em; }
    .nc-content p:last-child { margin-bottom: 0; }
    
    .nc-content ul { padding-left: 20px; color: inherit; }
    .nc-content li { margin-bottom: 6px; }
&lt;/style&gt;
&lt;h3 id=&#34;the-adventures-and-experiences-of-the-first-slovak-novel-斯洛伐克第一部小说的历险记&#34;&gt;The Adventures and Experiences of the First Slovak Novel 斯洛伐克第一部小说的历险记
&lt;/h3&gt;&lt;div class=&#34;note-card&#34;&gt;
    &lt;div class=&#34;nc-accent&#34;&gt;&lt;/div&gt;

    &lt;div class=&#34;nc-header&#34;&gt;
        &lt;div class=&#34;nc-meta&#34;&gt;
            &lt;span class=&#34;nc-badge&#34;&gt;READING&lt;/span&gt;
            &lt;span class=&#34;nc-date&#34;&gt;2025-10-09&lt;/span&gt;
        &lt;/div&gt; &lt;a href=&#34;https://publicdomainreview.org/essay/the-adventures-and-experiences-of-the-first-slovak-novel&#34; target=&#34;_blank&#34; class=&#34;nc-title&#34; title=&#34;访问原文&#34;&gt;
            The Adventures and Experiences of the First Slovak Novel 斯洛伐克第一部小说的历险记
            &lt;svg class=&#34;nc-link-icon&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
        &lt;/a&gt;
    &lt;/div&gt;

    
    &lt;div class=&#34;nc-context&#34;&gt;
        &lt;div class=&#34;nc-quote-icon&#34;&gt;“&lt;/div&gt;
        &lt;div class=&#34;nc-summary-text&#34;&gt;勒内，或：一个年轻人的冒险和经历（1783年），这是第一部斯洛伐克小说，是一部融合了成长小说、哲学、浪漫、冒险、游记、历史和东方主义奇幻等多种体裁的混合作品。它最初被禁止，但在共产主义时期因批评封建主义、资本主义和天主教会而广受欢迎。现首次被翻译成英文。&lt;/div&gt;
    &lt;/div&gt;
    

    
    
    
&lt;/div&gt;

&lt;style&gt;
     
    .note-card {
         
        --nc-bg-card: #ffffff;
        --nc-border: rgba(0,0,0,0.04);
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.08);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.12);
        
        --nc-title: #2c3e50;
        --nc-title-hover: #3a7bd5;
        --nc-meta: #999999;
        
        --nc-bg-context: #f8f9fa;
        --nc-border-context: #e2e8f0;
        --nc-quote-icon: #e2e8f0;
        --nc-text-summary: #555555;
        
        --nc-label-bg: #ffffff;
        --nc-label-text: #2d3748;
        --nc-content-text: #2d3748;
        --nc-link-icon: #cbd5e0;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.1);
        --nc-badge-text: #3a7bd5;

        position: relative;
        background: var(--nc-bg-card);
        border-radius: 12px;
        box-shadow: var(--nc-shadow);
        margin: 2.5rem 0;
        overflow: hidden;
        border: 1px solid var(--nc-border);
        font-family: inherit; 
        transition: transform 0.3s ease, box-shadow 0.3s ease, background 0.3s, border-color 0.3s;
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .note-card {
            --nc-bg-card: #1e1e1e;
            --nc-border: #333333;
            --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
            --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
            
            --nc-title: #f0f0f0;
            --nc-meta: #999999;
            
            --nc-bg-context: #252525;
            --nc-border-context: #444444;
            --nc-quote-icon: #333333;
            --nc-text-summary: #aaaaaa;
            
            --nc-label-bg: #1e1e1e;
            --nc-label-text: #cccccc;
            --nc-content-text: #dddddd;
            --nc-link-icon: #666666;
            
            --nc-badge-bg: rgba(58, 123, 213, 0.2);
        }
    }

    html[data-scheme=&#34;dark&#34;] .note-card {
        --nc-bg-card: #1e1e1e;
        --nc-border: #333333;
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
        
        --nc-title: #f0f0f0;
        --nc-meta: #999999;
        
        --nc-bg-context: #252525;
        --nc-border-context: #444444;
        --nc-quote-icon: #333333;
        --nc-text-summary: #aaaaaa;
        
        --nc-label-bg: #1e1e1e;
        --nc-label-text: #cccccc;
        --nc-content-text: #dddddd;
        --nc-link-icon: #666666;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.2);
    }

    .note-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--nc-shadow-hover);
    }

     
    .nc-accent {
        height: 4px;
        background: linear-gradient(90deg, #3a7bd5, #00d2ff); 
        width: 100%;
    }

     
    .nc-header {
        padding: 24px 28px 10px; 
    }

    .nc-meta {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 10px; 
        font-size: 13px; 
        color: var(--nc-meta);
        font-weight: 600;
        letter-spacing: 1px;
        text-transform: uppercase;
    }

    .nc-badge {
        color: var(--nc-badge-text);
        background: var(--nc-badge-bg);
        padding: 2px 6px;
        border-radius: 4px;
    }

    .nc-title {
        display: block;
        font-size: 2rem; 
        font-weight: 700;
        color: var(--nc-title);
        text-decoration: none;
        line-height: 1.3;
        transition: color 0.2s;
    }

    .nc-title:hover {
        color: var(--nc-title-hover);
    }

    .nc-link-icon {
        width: 20px; 
        height: 20px;
        color: var(--nc-link-icon);
        margin-left: 5px;
        vertical-align: middle;
        transition: color 0.2s;
    }

    .nc-title:hover .nc-link-icon {
        color: var(--nc-title-hover);
    }

     
    .nc-context {
        margin: 12px 28px 24px;
        background: var(--nc-bg-context);
        padding: 20px 24px;
        border-radius: 8px;
        position: relative;
        border-left: 4px solid var(--nc-border-context);
        transition: background 0.3s, border-color 0.3s;
    }

    .nc-quote-icon {
        position: absolute;
        top: 8px;
        left: 10px;
        font-family: serif; 
        font-size: 40px;
        line-height: 1;
        color: var(--nc-quote-icon);
        pointer-events: none;
        transition: color 0.3s;
    }

    .nc-summary-text {
        font-size: 1.7rem; 
        color: var(--nc-text-summary);
        line-height: 1.6;
        font-style: italic;
        position: relative;
        z-index: 1;
        padding-left: 15px; 
        transition: color 0.3s;
    }

     
    .nc-body {
        padding: 0 28px 32px;
        position: relative;
    }

     
    .nc-label {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        font-size: 13px; 
        font-weight: 700;
        color: var(--nc-label-text);
        background: var(--nc-label-bg);
        padding-right: 10px;
        margin-bottom: 12px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
        transition: color 0.3s, background 0.3s;
    }

    .nc-content {
        color: var(--nc-content-text);
        font-size: 1.6rem; 
        line-height: 1.75;
        transition: color 0.3s;
    }

     
    .nc-content p { margin-bottom: 1em; }
    .nc-content p:last-child { margin-bottom: 0; }
    
    .nc-content ul { padding-left: 20px; color: inherit; }
    .nc-content li { margin-bottom: 6px; }
&lt;/style&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-13&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        “Not all herein is fictional，or pure fantasy，nor，dear reader，will you find here an arbitrarily contrived morality existing solely in the mind of the author”，writes Jozef Ignác Bajza in the Foreword to ，published at his own expense in Pressburg，Upper Hungary，in 1783–85.Considered the first Slovak novel，it is also the first novel in a minor language published within the Habsburg monarchy. In the wider Central European context， was preceded only by novels in German and Polish，both large and much more developed languages. If the novel is a quintessentially modern genre，associated with the rise of the middle class，capitalism，the growth of the public sphere，individual freedom，and national movements and literacy，then the appearance of  in 1783 is almost an anomaly.
    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-13&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-14&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        Eighteenth-century Hungary was a feudal kingdom with a non-existent bourgeoisie，where Latin and German were the dominant languages of state administration，print media，and learning，and literacy was the privilege of the aristocracy and clergy. Slovak literary culture was paltry even in comparison with other small vernacular languages such as Czech or Hungarian，a fact lamented by Bajza in the Foreword: “We are indebted for this blight to the indolence of our forebears，who . . . failed to cultivate and enhance . . . their mother tongue，which is the last among languages and has suffered through no fault of its own，but of ours”.2 Fluent in German，Hungarian，Latin，Czech，and probably French，Bajza wrote the novel in Slovak to promote the idea of the Slovaks comprising a modern European nation with its own history，identity，and language. His protagonist，René，“the reborn”，stands in for Bajza’s idea of a sociocultural revival and moral regeneration of his society.
    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-14&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-15&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        Upper Hungary’s biggest urban centre，Pressburg/Poszony/Prešporok (today’s Bratislava)，had 30，000 inhabitants，of which ethnic Slovaks were a small minority，outnumbered by Germans and Hungarians. Even though Bratislava lies only sixty kilometres (forty miles) east of Vienna — one day by mail coach in his time，or a few hours by boat along the Danube — Bajza’s efforts to spread Enlightenment among his people were met with provincial prejudice，closed-mindedness，and open hostility. All his life，he struggled against provincial censors who considered his works too incendiary; were it not for his ingenuity and wilfulness，his novel would have never been published at all.
    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-15&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-16&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        A generically hybrid work，the novel mixes the bildungsroman with the philosophical novel，the romance，the adventure story，the travelogue，the history book，and the orientalist fantasy. It is testimony to the burden of the multiple functions that the novel was made to bear in a less developed literary culture，compensating for the scarcity of Slovak books with its didactic，social-critical，historical，political，linguistic，and philosophical ambitions. Action often gives way to lessons in useful knowledge for the benefit of the reader. Bajza’s narrator loses no opportunity to enlighten us about the nature of crocodiles or Islam，explain the use of various medicinal herbs，offer his opinion on such diverse topics as productive farming，the Slovak language，or arranged marriage，or provide historical lessons about the Slovaks and the ancient Egyptians，borrowing the latter from Herodotus.
    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-16&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;
&lt;p&gt;&lt;img src=&#34;https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A2025%E5%B9%B4%E7%AC%AC31-32%E6%9C%9F%E5%90%88%E5%88%8A%E6%80%BB%E7%AC%AC31-32%E6%9C%9F/20251009-Picture02.jpg&#34;
	width=&#34;1008&#34;
	height=&#34;850&#34;
	srcset=&#34;https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A2025%E5%B9%B4%E7%AC%AC31-32%E6%9C%9F%E5%90%88%E5%88%8A%E6%80%BB%E7%AC%AC31-32%E6%9C%9F/20251009-Picture02_hu_61054d03136f31.jpg 480w, https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A2025%E5%B9%B4%E7%AC%AC31-32%E6%9C%9F%E5%90%88%E5%88%8A%E6%80%BB%E7%AC%AC31-32%E6%9C%9F/20251009-Picture02_hu_27155e42087f9dd9.jpg 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;雷内，或：一个年轻人的冒险经历（René mláďenca príhodi a skúsenosťi，1783）的标题和第一页&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;118&#34;
		data-flex-basis=&#34;284px&#34;
	
&gt;&lt;/p&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-17&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        Bajza’s critical perspective is unavoidably limited by his time，as becomes clear when we follow René and Van Stiphout among the “backward heathens” (to Lebanon and Egypt) in Book I.4 Making his protagonists Venetian rather than Slovak has a clear aim: Venice is here the imagined centre of European culture，and René and Van Stiphout’s journey from Venice to the Middle East measures the distance between “civilisation” and “barbarity”. This contrast would have been much more difficult to achieve with Slovak protagonists，since the Slovaks，as the local cicerone in Book II explains to René，are not sure who they are and where they came from. This narrative displacement is testimony to the specific challenges of a Central European Enlightenment intellectual，alienated from his own stagnant culture which he wishes to modernise，his gaze steadily oriented toward the West. By identifying with René’s point of view，Bajza implicitly sets up the European civilizational space as a Slovak aspiration. In this sense，Bajza is as Eurocentric and ethnocentric as his French，German，English，or Polish contemporaries，and his novel typical of the European Enlightenment tradition. The story’s orientalist inspirations echo Voltaire’s  and Mozart’s  as well as Ignác Mészáros’  (1772)，a Hungarian adaptation of a French novel via a German translation (，1723，by a certain Menander)，but also a host of Central European narratives about the Orient and Ottoman invasions — travelogues，captivity narratives，folk epics，and legends.
    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-17&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;
&lt;h3 id=&#34;how-a-democracy-descends-into-murderous-fascism-on-pinochets-chile-智利皮诺切特时期民主如何沦为血腥的法西斯主义&#34;&gt;How a Democracy Descends Into Murderous Fascism: On Pinochet’s Chile 智利皮诺切特时期：民主如何沦为血腥的法西斯主义
&lt;/h3&gt;&lt;div class=&#34;note-card&#34;&gt;
    &lt;div class=&#34;nc-accent&#34;&gt;&lt;/div&gt;

    &lt;div class=&#34;nc-header&#34;&gt;
        &lt;div class=&#34;nc-meta&#34;&gt;
            &lt;span class=&#34;nc-badge&#34;&gt;READING&lt;/span&gt;
            &lt;span class=&#34;nc-date&#34;&gt;2025-10-09&lt;/span&gt;
        &lt;/div&gt; &lt;a href=&#34;https://lithub.com/how-a-democracy-descends-into-murderous-fascism-on-pinochets-chile/&#34; target=&#34;_blank&#34; class=&#34;nc-title&#34; title=&#34;访问原文&#34;&gt;
            How a Democracy Descends Into Murderous Fascism: On Pinochet’s Chile 智利皮诺切特时期：民主如何沦为血腥的法西斯主义
            &lt;svg class=&#34;nc-link-icon&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
        &lt;/a&gt;
    &lt;/div&gt;

    
    &lt;div class=&#34;nc-context&#34;&gt;
        &lt;div class=&#34;nc-quote-icon&#34;&gt;“&lt;/div&gt;
        &lt;div class=&#34;nc-summary-text&#34;&gt;智利独裁者奥古斯托·皮诺切特将军（1973年至1990年任智利总统）于1998年在伦敦因涉嫌犯下种族灭绝和酷刑罪而被捕。他的政权对4万多人次的拘押/酷刑和3000多人的谋杀/失踪负有责任。皮诺切特是一名反共人士，曾得到美国的支援，并推行了自由市场政策。尽管犯下了罪行，但他认为自己凌驾于法律之上，并受到大赦的保护。此次逮捕引发了愤怒和喜悦，凸显了人们对独裁者司法公正和有罪不罚问题的持续争论。&lt;/div&gt;
    &lt;/div&gt;
    

    
    
    
&lt;/div&gt;

&lt;style&gt;
     
    .note-card {
         
        --nc-bg-card: #ffffff;
        --nc-border: rgba(0,0,0,0.04);
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.08);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.12);
        
        --nc-title: #2c3e50;
        --nc-title-hover: #3a7bd5;
        --nc-meta: #999999;
        
        --nc-bg-context: #f8f9fa;
        --nc-border-context: #e2e8f0;
        --nc-quote-icon: #e2e8f0;
        --nc-text-summary: #555555;
        
        --nc-label-bg: #ffffff;
        --nc-label-text: #2d3748;
        --nc-content-text: #2d3748;
        --nc-link-icon: #cbd5e0;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.1);
        --nc-badge-text: #3a7bd5;

        position: relative;
        background: var(--nc-bg-card);
        border-radius: 12px;
        box-shadow: var(--nc-shadow);
        margin: 2.5rem 0;
        overflow: hidden;
        border: 1px solid var(--nc-border);
        font-family: inherit; 
        transition: transform 0.3s ease, box-shadow 0.3s ease, background 0.3s, border-color 0.3s;
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .note-card {
            --nc-bg-card: #1e1e1e;
            --nc-border: #333333;
            --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
            --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
            
            --nc-title: #f0f0f0;
            --nc-meta: #999999;
            
            --nc-bg-context: #252525;
            --nc-border-context: #444444;
            --nc-quote-icon: #333333;
            --nc-text-summary: #aaaaaa;
            
            --nc-label-bg: #1e1e1e;
            --nc-label-text: #cccccc;
            --nc-content-text: #dddddd;
            --nc-link-icon: #666666;
            
            --nc-badge-bg: rgba(58, 123, 213, 0.2);
        }
    }

    html[data-scheme=&#34;dark&#34;] .note-card {
        --nc-bg-card: #1e1e1e;
        --nc-border: #333333;
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
        
        --nc-title: #f0f0f0;
        --nc-meta: #999999;
        
        --nc-bg-context: #252525;
        --nc-border-context: #444444;
        --nc-quote-icon: #333333;
        --nc-text-summary: #aaaaaa;
        
        --nc-label-bg: #1e1e1e;
        --nc-label-text: #cccccc;
        --nc-content-text: #dddddd;
        --nc-link-icon: #666666;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.2);
    }

    .note-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--nc-shadow-hover);
    }

     
    .nc-accent {
        height: 4px;
        background: linear-gradient(90deg, #3a7bd5, #00d2ff); 
        width: 100%;
    }

     
    .nc-header {
        padding: 24px 28px 10px; 
    }

    .nc-meta {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 10px; 
        font-size: 13px; 
        color: var(--nc-meta);
        font-weight: 600;
        letter-spacing: 1px;
        text-transform: uppercase;
    }

    .nc-badge {
        color: var(--nc-badge-text);
        background: var(--nc-badge-bg);
        padding: 2px 6px;
        border-radius: 4px;
    }

    .nc-title {
        display: block;
        font-size: 2rem; 
        font-weight: 700;
        color: var(--nc-title);
        text-decoration: none;
        line-height: 1.3;
        transition: color 0.2s;
    }

    .nc-title:hover {
        color: var(--nc-title-hover);
    }

    .nc-link-icon {
        width: 20px; 
        height: 20px;
        color: var(--nc-link-icon);
        margin-left: 5px;
        vertical-align: middle;
        transition: color 0.2s;
    }

    .nc-title:hover .nc-link-icon {
        color: var(--nc-title-hover);
    }

     
    .nc-context {
        margin: 12px 28px 24px;
        background: var(--nc-bg-context);
        padding: 20px 24px;
        border-radius: 8px;
        position: relative;
        border-left: 4px solid var(--nc-border-context);
        transition: background 0.3s, border-color 0.3s;
    }

    .nc-quote-icon {
        position: absolute;
        top: 8px;
        left: 10px;
        font-family: serif; 
        font-size: 40px;
        line-height: 1;
        color: var(--nc-quote-icon);
        pointer-events: none;
        transition: color 0.3s;
    }

    .nc-summary-text {
        font-size: 1.7rem; 
        color: var(--nc-text-summary);
        line-height: 1.6;
        font-style: italic;
        position: relative;
        z-index: 1;
        padding-left: 15px; 
        transition: color 0.3s;
    }

     
    .nc-body {
        padding: 0 28px 32px;
        position: relative;
    }

     
    .nc-label {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        font-size: 13px; 
        font-weight: 700;
        color: var(--nc-label-text);
        background: var(--nc-label-bg);
        padding-right: 10px;
        margin-bottom: 12px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
        transition: color 0.3s, background 0.3s;
    }

    .nc-content {
        color: var(--nc-content-text);
        font-size: 1.6rem; 
        line-height: 1.75;
        transition: color 0.3s;
    }

     
    .nc-content p { margin-bottom: 1em; }
    .nc-content p:last-child { margin-bottom: 0; }
    
    .nc-content ul { padding-left: 20px; color: inherit; }
    .nc-content li { margin-bottom: 6px; }
&lt;/style&gt;
&lt;h3 id=&#34;to-haunt-and-be-haunted-on-the-exhumation-of-edgar-allen-poe-祭奠与被祭奠论埃德加爱伦坡的掘墓&#34;&gt;To Haunt and Be Haunted: On the Exhumation of Edgar Allen Poe 祭奠与被祭奠：论埃德加·爱伦·坡的掘墓
&lt;/h3&gt;&lt;div class=&#34;note-card&#34;&gt;
    &lt;div class=&#34;nc-accent&#34;&gt;&lt;/div&gt;

    &lt;div class=&#34;nc-header&#34;&gt;
        &lt;div class=&#34;nc-meta&#34;&gt;
            &lt;span class=&#34;nc-badge&#34;&gt;READING&lt;/span&gt;
            &lt;span class=&#34;nc-date&#34;&gt;2025-10-09&lt;/span&gt;
        &lt;/div&gt; &lt;a href=&#34;https://lithub.com/to-haunt-and-be-haunted-on-the-exhumation-of-edgar-allen-poe/&#34; target=&#34;_blank&#34; class=&#34;nc-title&#34; title=&#34;访问原文&#34;&gt;
            To Haunt and Be Haunted: On the Exhumation of Edgar Allen Poe 祭奠与被祭奠：论埃德加·爱伦·坡的掘墓
            &lt;svg class=&#34;nc-link-icon&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
        &lt;/a&gt;
    &lt;/div&gt;

    
    &lt;div class=&#34;nc-context&#34;&gt;
        &lt;div class=&#34;nc-quote-icon&#34;&gt;“&lt;/div&gt;
        &lt;div class=&#34;nc-summary-text&#34;&gt;埃德加·爱伦·坡对被活埋的痴迷，在他的故事中显而易见，助长了公众认为他自己被活埋的误解。这一神话，被他的对手鲁弗斯·格里斯沃尔德夸大，掩盖了坡多样的文学贡献。他死因不明以及后来的一次开棺验尸，其棺材散架，进一步加剧了猜测。对被活埋的持久恐惧，即埋葬恐惧症，与坡对生死界限令人不安的探索产生了共鸣。&lt;/div&gt;
    &lt;/div&gt;
    

    
    
    
&lt;/div&gt;

&lt;style&gt;
     
    .note-card {
         
        --nc-bg-card: #ffffff;
        --nc-border: rgba(0,0,0,0.04);
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.08);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.12);
        
        --nc-title: #2c3e50;
        --nc-title-hover: #3a7bd5;
        --nc-meta: #999999;
        
        --nc-bg-context: #f8f9fa;
        --nc-border-context: #e2e8f0;
        --nc-quote-icon: #e2e8f0;
        --nc-text-summary: #555555;
        
        --nc-label-bg: #ffffff;
        --nc-label-text: #2d3748;
        --nc-content-text: #2d3748;
        --nc-link-icon: #cbd5e0;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.1);
        --nc-badge-text: #3a7bd5;

        position: relative;
        background: var(--nc-bg-card);
        border-radius: 12px;
        box-shadow: var(--nc-shadow);
        margin: 2.5rem 0;
        overflow: hidden;
        border: 1px solid var(--nc-border);
        font-family: inherit; 
        transition: transform 0.3s ease, box-shadow 0.3s ease, background 0.3s, border-color 0.3s;
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .note-card {
            --nc-bg-card: #1e1e1e;
            --nc-border: #333333;
            --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
            --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
            
            --nc-title: #f0f0f0;
            --nc-meta: #999999;
            
            --nc-bg-context: #252525;
            --nc-border-context: #444444;
            --nc-quote-icon: #333333;
            --nc-text-summary: #aaaaaa;
            
            --nc-label-bg: #1e1e1e;
            --nc-label-text: #cccccc;
            --nc-content-text: #dddddd;
            --nc-link-icon: #666666;
            
            --nc-badge-bg: rgba(58, 123, 213, 0.2);
        }
    }

    html[data-scheme=&#34;dark&#34;] .note-card {
        --nc-bg-card: #1e1e1e;
        --nc-border: #333333;
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
        
        --nc-title: #f0f0f0;
        --nc-meta: #999999;
        
        --nc-bg-context: #252525;
        --nc-border-context: #444444;
        --nc-quote-icon: #333333;
        --nc-text-summary: #aaaaaa;
        
        --nc-label-bg: #1e1e1e;
        --nc-label-text: #cccccc;
        --nc-content-text: #dddddd;
        --nc-link-icon: #666666;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.2);
    }

    .note-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--nc-shadow-hover);
    }

     
    .nc-accent {
        height: 4px;
        background: linear-gradient(90deg, #3a7bd5, #00d2ff); 
        width: 100%;
    }

     
    .nc-header {
        padding: 24px 28px 10px; 
    }

    .nc-meta {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 10px; 
        font-size: 13px; 
        color: var(--nc-meta);
        font-weight: 600;
        letter-spacing: 1px;
        text-transform: uppercase;
    }

    .nc-badge {
        color: var(--nc-badge-text);
        background: var(--nc-badge-bg);
        padding: 2px 6px;
        border-radius: 4px;
    }

    .nc-title {
        display: block;
        font-size: 2rem; 
        font-weight: 700;
        color: var(--nc-title);
        text-decoration: none;
        line-height: 1.3;
        transition: color 0.2s;
    }

    .nc-title:hover {
        color: var(--nc-title-hover);
    }

    .nc-link-icon {
        width: 20px; 
        height: 20px;
        color: var(--nc-link-icon);
        margin-left: 5px;
        vertical-align: middle;
        transition: color 0.2s;
    }

    .nc-title:hover .nc-link-icon {
        color: var(--nc-title-hover);
    }

     
    .nc-context {
        margin: 12px 28px 24px;
        background: var(--nc-bg-context);
        padding: 20px 24px;
        border-radius: 8px;
        position: relative;
        border-left: 4px solid var(--nc-border-context);
        transition: background 0.3s, border-color 0.3s;
    }

    .nc-quote-icon {
        position: absolute;
        top: 8px;
        left: 10px;
        font-family: serif; 
        font-size: 40px;
        line-height: 1;
        color: var(--nc-quote-icon);
        pointer-events: none;
        transition: color 0.3s;
    }

    .nc-summary-text {
        font-size: 1.7rem; 
        color: var(--nc-text-summary);
        line-height: 1.6;
        font-style: italic;
        position: relative;
        z-index: 1;
        padding-left: 15px; 
        transition: color 0.3s;
    }

     
    .nc-body {
        padding: 0 28px 32px;
        position: relative;
    }

     
    .nc-label {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        font-size: 13px; 
        font-weight: 700;
        color: var(--nc-label-text);
        background: var(--nc-label-bg);
        padding-right: 10px;
        margin-bottom: 12px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
        transition: color 0.3s, background 0.3s;
    }

    .nc-content {
        color: var(--nc-content-text);
        font-size: 1.6rem; 
        line-height: 1.75;
        transition: color 0.3s;
    }

     
    .nc-content p { margin-bottom: 1em; }
    .nc-content p:last-child { margin-bottom: 0; }
    
    .nc-content ul { padding-left: 20px; color: inherit; }
    .nc-content li { margin-bottom: 6px; }
&lt;/style&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-20&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        “There are certain themes of which the interest is all-absorbing，but which are entirely too horrible for the purposes of legitimate fiction，” wrote Edgar Allan Poe in his 1844 short story “The Premature Burial，” first printed in Poe himself wasn’t buried alive. A common misconception，of the sort that was spread about the cadaverous-appearing Southerner by Rufus Wilmot Griswold，rival writer and self-appointed literary executor，who fervently maligned Poe in his obituary.
    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-20&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-21&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        There was，as with many of those living in the gloaming aesthetic twilight of Romanticism，a tendency to confuse the characters with their creator，a narrator with the author. Griswold writes that Poe’s work illustrated a “morbid sensitiveness of feeling，a shadowy and gloomy imagination，and a taste almost faultless in the apprehension of that sort of beauty most agreeable to his temper.” Suddenly Poe was no longer a professional writer，but he was Roderick Usher，or the doppelganger-murderer William Wilson，or the anonymous sociopath haunted by the beating of his victim’s heart. With such easy elisions between author and work，it’s no wonder that many assumed he suffered the same fate as “The Premature Burial，” but Poe’s corpse is not his corpus.
    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-21&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-22&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        Here is the paradox，for in his silence Poe was actually the most American，exemplifying our national talent at sublimation and repression. Edgar Allan Poe，adopted son of a Virginian enslaver; Edgar Allan Poe，who managed the sale of a human being owned by his mother-in-law. “No early American writer，” notes Toni Morrison in “is more important to the concept of American Africanism than Poe.” A writer who，as with the best of them，always said more in what he didn’t say，obsessed with that which was too horrible to contemplate. Such history can be buried，but it’s buried alive. The scratching at the lid is incessant.
    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-22&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;
&lt;h3 id=&#34;love-and-sustenance-why-indian-mothers-obsess-over-feeding-our-kids-爱与滋养为什么印度母亲痴迷于喂养我们的孩子&#34;&gt;Love and Sustenance: Why Indian Mothers Obsess Over Feeding Our Kids 爱与滋养：为什么印度母亲痴迷于喂养我们的孩子
&lt;/h3&gt;&lt;div class=&#34;note-card&#34;&gt;
    &lt;div class=&#34;nc-accent&#34;&gt;&lt;/div&gt;

    &lt;div class=&#34;nc-header&#34;&gt;
        &lt;div class=&#34;nc-meta&#34;&gt;
            &lt;span class=&#34;nc-badge&#34;&gt;READING&lt;/span&gt;
            &lt;span class=&#34;nc-date&#34;&gt;2025-10-09&lt;/span&gt;
        &lt;/div&gt; &lt;a href=&#34;https://lithub.com/love-and-sustenance-why-indian-mothers-obsess-over-feeding-our-kids/&#34; target=&#34;_blank&#34; class=&#34;nc-title&#34; title=&#34;访问原文&#34;&gt;
            Love and Sustenance: Why Indian Mothers Obsess Over Feeding Our Kids 爱与滋养：为什么印度母亲痴迷于喂养我们的孩子
            &lt;svg class=&#34;nc-link-icon&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
        &lt;/a&gt;
    &lt;/div&gt;

    
    &lt;div class=&#34;nc-context&#34;&gt;
        &lt;div class=&#34;nc-quote-icon&#34;&gt;“&lt;/div&gt;
        &lt;div class=&#34;nc-summary-text&#34;&gt;印度母亲常常通过喂食来表达爱，这是一种根植于文化传统和相互依存观念的做法。这种根深蒂固的本能，包括喂食和不断的食物供给，可能会给努力适应西方独立观念的移民父母带来冲突。作者探讨了这种养育行为，尽管有时被认为过度，但最终反映了深刻的联系和母亲的自我关怀。&lt;/div&gt;
    &lt;/div&gt;
    

    
    
    
&lt;/div&gt;

&lt;style&gt;
     
    .note-card {
         
        --nc-bg-card: #ffffff;
        --nc-border: rgba(0,0,0,0.04);
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.08);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.12);
        
        --nc-title: #2c3e50;
        --nc-title-hover: #3a7bd5;
        --nc-meta: #999999;
        
        --nc-bg-context: #f8f9fa;
        --nc-border-context: #e2e8f0;
        --nc-quote-icon: #e2e8f0;
        --nc-text-summary: #555555;
        
        --nc-label-bg: #ffffff;
        --nc-label-text: #2d3748;
        --nc-content-text: #2d3748;
        --nc-link-icon: #cbd5e0;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.1);
        --nc-badge-text: #3a7bd5;

        position: relative;
        background: var(--nc-bg-card);
        border-radius: 12px;
        box-shadow: var(--nc-shadow);
        margin: 2.5rem 0;
        overflow: hidden;
        border: 1px solid var(--nc-border);
        font-family: inherit; 
        transition: transform 0.3s ease, box-shadow 0.3s ease, background 0.3s, border-color 0.3s;
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .note-card {
            --nc-bg-card: #1e1e1e;
            --nc-border: #333333;
            --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
            --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
            
            --nc-title: #f0f0f0;
            --nc-meta: #999999;
            
            --nc-bg-context: #252525;
            --nc-border-context: #444444;
            --nc-quote-icon: #333333;
            --nc-text-summary: #aaaaaa;
            
            --nc-label-bg: #1e1e1e;
            --nc-label-text: #cccccc;
            --nc-content-text: #dddddd;
            --nc-link-icon: #666666;
            
            --nc-badge-bg: rgba(58, 123, 213, 0.2);
        }
    }

    html[data-scheme=&#34;dark&#34;] .note-card {
        --nc-bg-card: #1e1e1e;
        --nc-border: #333333;
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
        
        --nc-title: #f0f0f0;
        --nc-meta: #999999;
        
        --nc-bg-context: #252525;
        --nc-border-context: #444444;
        --nc-quote-icon: #333333;
        --nc-text-summary: #aaaaaa;
        
        --nc-label-bg: #1e1e1e;
        --nc-label-text: #cccccc;
        --nc-content-text: #dddddd;
        --nc-link-icon: #666666;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.2);
    }

    .note-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--nc-shadow-hover);
    }

     
    .nc-accent {
        height: 4px;
        background: linear-gradient(90deg, #3a7bd5, #00d2ff); 
        width: 100%;
    }

     
    .nc-header {
        padding: 24px 28px 10px; 
    }

    .nc-meta {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 10px; 
        font-size: 13px; 
        color: var(--nc-meta);
        font-weight: 600;
        letter-spacing: 1px;
        text-transform: uppercase;
    }

    .nc-badge {
        color: var(--nc-badge-text);
        background: var(--nc-badge-bg);
        padding: 2px 6px;
        border-radius: 4px;
    }

    .nc-title {
        display: block;
        font-size: 2rem; 
        font-weight: 700;
        color: var(--nc-title);
        text-decoration: none;
        line-height: 1.3;
        transition: color 0.2s;
    }

    .nc-title:hover {
        color: var(--nc-title-hover);
    }

    .nc-link-icon {
        width: 20px; 
        height: 20px;
        color: var(--nc-link-icon);
        margin-left: 5px;
        vertical-align: middle;
        transition: color 0.2s;
    }

    .nc-title:hover .nc-link-icon {
        color: var(--nc-title-hover);
    }

     
    .nc-context {
        margin: 12px 28px 24px;
        background: var(--nc-bg-context);
        padding: 20px 24px;
        border-radius: 8px;
        position: relative;
        border-left: 4px solid var(--nc-border-context);
        transition: background 0.3s, border-color 0.3s;
    }

    .nc-quote-icon {
        position: absolute;
        top: 8px;
        left: 10px;
        font-family: serif; 
        font-size: 40px;
        line-height: 1;
        color: var(--nc-quote-icon);
        pointer-events: none;
        transition: color 0.3s;
    }

    .nc-summary-text {
        font-size: 1.7rem; 
        color: var(--nc-text-summary);
        line-height: 1.6;
        font-style: italic;
        position: relative;
        z-index: 1;
        padding-left: 15px; 
        transition: color 0.3s;
    }

     
    .nc-body {
        padding: 0 28px 32px;
        position: relative;
    }

     
    .nc-label {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        font-size: 13px; 
        font-weight: 700;
        color: var(--nc-label-text);
        background: var(--nc-label-bg);
        padding-right: 10px;
        margin-bottom: 12px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
        transition: color 0.3s, background 0.3s;
    }

    .nc-content {
        color: var(--nc-content-text);
        font-size: 1.6rem; 
        line-height: 1.75;
        transition: color 0.3s;
    }

     
    .nc-content p { margin-bottom: 1em; }
    .nc-content p:last-child { margin-bottom: 0; }
    
    .nc-content ul { padding-left: 20px; color: inherit; }
    .nc-content li { margin-bottom: 6px; }
&lt;/style&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-24&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        Most Indian food，except for liquid dals and curries，is enjoyed by eating it directly with the fingers. As someone who uses both her fingers and utensils to eat，I can attest to the sensuality of letting your fingers taste warmth and spice even before the food reaches your mouth. Eating with the hands can help you slow down and be more mindful about what you are putting into your mouth. According to Ayurveda，the traditional Indian system of medicine，eating with your hands is hygienic (after having washed your hands，of course) and beneficial to your senses and digestion. When we touch food with our fingers，Ayurveda suggests，we send signals to our brains that we are ready to eat，which activates our digestive organs.
    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-24&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-25&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        While parenting in America without sustained family support，I learned from various forums on the internet that the focus is on making your child independent and capable of survival when they leave the nest. In contrast，parenting in India stresses making the child aware of the interdependence of family members. Just as parents care for children in their infancy，children are expected to care for their aging parents when they grow up. All of this is，of course，overly simplified and in a constant state of change as the world continues to shrink and societies influence each other through various media and migrations.
    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-25&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;
&lt;h3 id=&#34;hauser-and-zwirners-uk-galleries-report-nearly-90-drop-in-earnings-豪瑟沃斯和卓纳画廊英国画廊的收入下降了近90&#34;&gt;Hauser and Zwirner’s UK Galleries Report Nearly 90% Drop in Earnings 豪瑟沃斯和卓纳画廊英国画廊的收入下降了近90%
&lt;/h3&gt;&lt;div class=&#34;note-card&#34;&gt;
    &lt;div class=&#34;nc-accent&#34;&gt;&lt;/div&gt;

    &lt;div class=&#34;nc-header&#34;&gt;
        &lt;div class=&#34;nc-meta&#34;&gt;
            &lt;span class=&#34;nc-badge&#34;&gt;READING&lt;/span&gt;
            &lt;span class=&#34;nc-date&#34;&gt;2025-10-09&lt;/span&gt;
        &lt;/div&gt; &lt;a href=&#34;https://hyperallergic.com/1047704/hauser-wirth-david-zwirner-uk-galleries-report-nearly-90-percent-drop-in-earnings/&#34; target=&#34;_blank&#34; class=&#34;nc-title&#34; title=&#34;访问原文&#34;&gt;
            Hauser and Zwirner’s UK Galleries Report Nearly 90% Drop in Earnings 豪瑟沃斯和卓纳画廊英国画廊的收入下降了近90%
            &lt;svg class=&#34;nc-link-icon&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
        &lt;/a&gt;
    &lt;/div&gt;

    
    &lt;div class=&#34;nc-context&#34;&gt;
        &lt;div class=&#34;nc-quote-icon&#34;&gt;“&lt;/div&gt;
        &lt;div class=&#34;nc-summary-text&#34;&gt;英国的豪瑟沃斯画廊和佩斯画廊在 2024 年的收入下降了近 90%。豪瑟沃斯画廊的税前利润从 930 万英镑降至 116 万英镑，收入也减半。佩斯画廊的收入从 5540 万英镑下降到 3710 万英镑。这些下滑与全球艺术市场普遍存在的、传闻已久的多年低迷期相吻合，其特点是销售额下降和画廊倒闭。&lt;/div&gt;
    &lt;/div&gt;
    

    
    
    
&lt;/div&gt;

&lt;style&gt;
     
    .note-card {
         
        --nc-bg-card: #ffffff;
        --nc-border: rgba(0,0,0,0.04);
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.08);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.12);
        
        --nc-title: #2c3e50;
        --nc-title-hover: #3a7bd5;
        --nc-meta: #999999;
        
        --nc-bg-context: #f8f9fa;
        --nc-border-context: #e2e8f0;
        --nc-quote-icon: #e2e8f0;
        --nc-text-summary: #555555;
        
        --nc-label-bg: #ffffff;
        --nc-label-text: #2d3748;
        --nc-content-text: #2d3748;
        --nc-link-icon: #cbd5e0;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.1);
        --nc-badge-text: #3a7bd5;

        position: relative;
        background: var(--nc-bg-card);
        border-radius: 12px;
        box-shadow: var(--nc-shadow);
        margin: 2.5rem 0;
        overflow: hidden;
        border: 1px solid var(--nc-border);
        font-family: inherit; 
        transition: transform 0.3s ease, box-shadow 0.3s ease, background 0.3s, border-color 0.3s;
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .note-card {
            --nc-bg-card: #1e1e1e;
            --nc-border: #333333;
            --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
            --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
            
            --nc-title: #f0f0f0;
            --nc-meta: #999999;
            
            --nc-bg-context: #252525;
            --nc-border-context: #444444;
            --nc-quote-icon: #333333;
            --nc-text-summary: #aaaaaa;
            
            --nc-label-bg: #1e1e1e;
            --nc-label-text: #cccccc;
            --nc-content-text: #dddddd;
            --nc-link-icon: #666666;
            
            --nc-badge-bg: rgba(58, 123, 213, 0.2);
        }
    }

    html[data-scheme=&#34;dark&#34;] .note-card {
        --nc-bg-card: #1e1e1e;
        --nc-border: #333333;
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
        
        --nc-title: #f0f0f0;
        --nc-meta: #999999;
        
        --nc-bg-context: #252525;
        --nc-border-context: #444444;
        --nc-quote-icon: #333333;
        --nc-text-summary: #aaaaaa;
        
        --nc-label-bg: #1e1e1e;
        --nc-label-text: #cccccc;
        --nc-content-text: #dddddd;
        --nc-link-icon: #666666;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.2);
    }

    .note-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--nc-shadow-hover);
    }

     
    .nc-accent {
        height: 4px;
        background: linear-gradient(90deg, #3a7bd5, #00d2ff); 
        width: 100%;
    }

     
    .nc-header {
        padding: 24px 28px 10px; 
    }

    .nc-meta {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 10px; 
        font-size: 13px; 
        color: var(--nc-meta);
        font-weight: 600;
        letter-spacing: 1px;
        text-transform: uppercase;
    }

    .nc-badge {
        color: var(--nc-badge-text);
        background: var(--nc-badge-bg);
        padding: 2px 6px;
        border-radius: 4px;
    }

    .nc-title {
        display: block;
        font-size: 2rem; 
        font-weight: 700;
        color: var(--nc-title);
        text-decoration: none;
        line-height: 1.3;
        transition: color 0.2s;
    }

    .nc-title:hover {
        color: var(--nc-title-hover);
    }

    .nc-link-icon {
        width: 20px; 
        height: 20px;
        color: var(--nc-link-icon);
        margin-left: 5px;
        vertical-align: middle;
        transition: color 0.2s;
    }

    .nc-title:hover .nc-link-icon {
        color: var(--nc-title-hover);
    }

     
    .nc-context {
        margin: 12px 28px 24px;
        background: var(--nc-bg-context);
        padding: 20px 24px;
        border-radius: 8px;
        position: relative;
        border-left: 4px solid var(--nc-border-context);
        transition: background 0.3s, border-color 0.3s;
    }

    .nc-quote-icon {
        position: absolute;
        top: 8px;
        left: 10px;
        font-family: serif; 
        font-size: 40px;
        line-height: 1;
        color: var(--nc-quote-icon);
        pointer-events: none;
        transition: color 0.3s;
    }

    .nc-summary-text {
        font-size: 1.7rem; 
        color: var(--nc-text-summary);
        line-height: 1.6;
        font-style: italic;
        position: relative;
        z-index: 1;
        padding-left: 15px; 
        transition: color 0.3s;
    }

     
    .nc-body {
        padding: 0 28px 32px;
        position: relative;
    }

     
    .nc-label {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        font-size: 13px; 
        font-weight: 700;
        color: var(--nc-label-text);
        background: var(--nc-label-bg);
        padding-right: 10px;
        margin-bottom: 12px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
        transition: color 0.3s, background 0.3s;
    }

    .nc-content {
        color: var(--nc-content-text);
        font-size: 1.6rem; 
        line-height: 1.75;
        transition: color 0.3s;
    }

     
    .nc-content p { margin-bottom: 1em; }
    .nc-content p:last-child { margin-bottom: 0; }
    
    .nc-content ul { padding-left: 20px; color: inherit; }
    .nc-content li { margin-bottom: 6px; }
&lt;/style&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-27&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        Per statements first reported by the Financial Times，Hauser &amp;amp; Wirth’s UK pre-tax profit dropped to £1.16 million (&lt;del&gt;$1.56 million) from £9.3 million (&lt;/del&gt;$12.5 million) in 2023. The same filings show that Hauser &amp;amp; Wirth’s total revenue of £68.3 million (&lt;del&gt;$91.7 million) was just under half of the £143.9 million (&lt;/del&gt;$193.2 million) in 2023.
    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-27&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-28&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        In April，the annual Art Basel and UBS Art Market Report documented a 12% decline in global art sales in 2024. During the first half of this year，art market research firm ArtTactic reported that total auction sales at Sotheby’s，Christie’s，and Phillips fell by 6%. The art world has also been witnessing a growing list of gallery closures，which last week reportedly spread to Almine Rech’s 11-year-old London branch and Pace’s Hong Kong exhibition space.
    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-28&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;
&lt;h3 id=&#34;tapestries-that-contain-the-world-包含世界的挂毯&#34;&gt;Tapestries That Contain the World 包含世界的挂毯
&lt;/h3&gt;&lt;div class=&#34;note-card&#34;&gt;
    &lt;div class=&#34;nc-accent&#34;&gt;&lt;/div&gt;

    &lt;div class=&#34;nc-header&#34;&gt;
        &lt;div class=&#34;nc-meta&#34;&gt;
            &lt;span class=&#34;nc-badge&#34;&gt;READING&lt;/span&gt;
            &lt;span class=&#34;nc-date&#34;&gt;2025-10-09&lt;/span&gt;
        &lt;/div&gt; &lt;a href=&#34;https://hyperallergic.com/1046692/mour-jaouda-tapestries-that-contain-the-world-spike-island/&#34; target=&#34;_blank&#34; class=&#34;nc-title&#34; title=&#34;访问原文&#34;&gt;
            Tapestries That Contain the World 包含世界的挂毯
            &lt;svg class=&#34;nc-link-icon&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
        &lt;/a&gt;
    &lt;/div&gt;

    
    &lt;div class=&#34;nc-context&#34;&gt;
        &lt;div class=&#34;nc-quote-icon&#34;&gt;“&lt;/div&gt;
        &lt;div class=&#34;nc-summary-text&#34;&gt;努尔·贾乌达的展览“我们如何承载无尽的蓝色？”以一个中央帐篷装置为特色，这是一个装饰着巴勒斯坦鸢尾花等植物图案的纪念空间，象征着抵抗和失落。她手工染色的纺织品作品由剩余材料组装而成，探讨了循环记忆、耐力和治愈的主题。分层的织物唤起了这片土地作为文化遗产脆弱载体的形象，反映了创造与修复的连续体。&lt;/div&gt;
    &lt;/div&gt;
    

    
    
    
&lt;/div&gt;

&lt;style&gt;
     
    .note-card {
         
        --nc-bg-card: #ffffff;
        --nc-border: rgba(0,0,0,0.04);
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.08);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.12);
        
        --nc-title: #2c3e50;
        --nc-title-hover: #3a7bd5;
        --nc-meta: #999999;
        
        --nc-bg-context: #f8f9fa;
        --nc-border-context: #e2e8f0;
        --nc-quote-icon: #e2e8f0;
        --nc-text-summary: #555555;
        
        --nc-label-bg: #ffffff;
        --nc-label-text: #2d3748;
        --nc-content-text: #2d3748;
        --nc-link-icon: #cbd5e0;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.1);
        --nc-badge-text: #3a7bd5;

        position: relative;
        background: var(--nc-bg-card);
        border-radius: 12px;
        box-shadow: var(--nc-shadow);
        margin: 2.5rem 0;
        overflow: hidden;
        border: 1px solid var(--nc-border);
        font-family: inherit; 
        transition: transform 0.3s ease, box-shadow 0.3s ease, background 0.3s, border-color 0.3s;
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .note-card {
            --nc-bg-card: #1e1e1e;
            --nc-border: #333333;
            --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
            --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
            
            --nc-title: #f0f0f0;
            --nc-meta: #999999;
            
            --nc-bg-context: #252525;
            --nc-border-context: #444444;
            --nc-quote-icon: #333333;
            --nc-text-summary: #aaaaaa;
            
            --nc-label-bg: #1e1e1e;
            --nc-label-text: #cccccc;
            --nc-content-text: #dddddd;
            --nc-link-icon: #666666;
            
            --nc-badge-bg: rgba(58, 123, 213, 0.2);
        }
    }

    html[data-scheme=&#34;dark&#34;] .note-card {
        --nc-bg-card: #1e1e1e;
        --nc-border: #333333;
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
        
        --nc-title: #f0f0f0;
        --nc-meta: #999999;
        
        --nc-bg-context: #252525;
        --nc-border-context: #444444;
        --nc-quote-icon: #333333;
        --nc-text-summary: #aaaaaa;
        
        --nc-label-bg: #1e1e1e;
        --nc-label-text: #cccccc;
        --nc-content-text: #dddddd;
        --nc-link-icon: #666666;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.2);
    }

    .note-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--nc-shadow-hover);
    }

     
    .nc-accent {
        height: 4px;
        background: linear-gradient(90deg, #3a7bd5, #00d2ff); 
        width: 100%;
    }

     
    .nc-header {
        padding: 24px 28px 10px; 
    }

    .nc-meta {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 10px; 
        font-size: 13px; 
        color: var(--nc-meta);
        font-weight: 600;
        letter-spacing: 1px;
        text-transform: uppercase;
    }

    .nc-badge {
        color: var(--nc-badge-text);
        background: var(--nc-badge-bg);
        padding: 2px 6px;
        border-radius: 4px;
    }

    .nc-title {
        display: block;
        font-size: 2rem; 
        font-weight: 700;
        color: var(--nc-title);
        text-decoration: none;
        line-height: 1.3;
        transition: color 0.2s;
    }

    .nc-title:hover {
        color: var(--nc-title-hover);
    }

    .nc-link-icon {
        width: 20px; 
        height: 20px;
        color: var(--nc-link-icon);
        margin-left: 5px;
        vertical-align: middle;
        transition: color 0.2s;
    }

    .nc-title:hover .nc-link-icon {
        color: var(--nc-title-hover);
    }

     
    .nc-context {
        margin: 12px 28px 24px;
        background: var(--nc-bg-context);
        padding: 20px 24px;
        border-radius: 8px;
        position: relative;
        border-left: 4px solid var(--nc-border-context);
        transition: background 0.3s, border-color 0.3s;
    }

    .nc-quote-icon {
        position: absolute;
        top: 8px;
        left: 10px;
        font-family: serif; 
        font-size: 40px;
        line-height: 1;
        color: var(--nc-quote-icon);
        pointer-events: none;
        transition: color 0.3s;
    }

    .nc-summary-text {
        font-size: 1.7rem; 
        color: var(--nc-text-summary);
        line-height: 1.6;
        font-style: italic;
        position: relative;
        z-index: 1;
        padding-left: 15px; 
        transition: color 0.3s;
    }

     
    .nc-body {
        padding: 0 28px 32px;
        position: relative;
    }

     
    .nc-label {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        font-size: 13px; 
        font-weight: 700;
        color: var(--nc-label-text);
        background: var(--nc-label-bg);
        padding-right: 10px;
        margin-bottom: 12px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
        transition: color 0.3s, background 0.3s;
    }

    .nc-content {
        color: var(--nc-content-text);
        font-size: 1.6rem; 
        line-height: 1.75;
        transition: color 0.3s;
    }

     
    .nc-content p { margin-bottom: 1em; }
    .nc-content p:last-child { margin-bottom: 0; }
    
    .nc-content ul { padding-left: 20px; color: inherit; }
    .nc-content li { margin-bottom: 6px; }
&lt;/style&gt;
&lt;p&gt;&lt;img src=&#34;https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A2025%E5%B9%B4%E7%AC%AC31-32%E6%9C%9F%E5%90%88%E5%88%8A%E6%80%BB%E7%AC%AC31-32%E6%9C%9F/20251009-Picture03.jpg&#34;
	width=&#34;1024&#34;
	height=&#34;640&#34;
	srcset=&#34;https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A2025%E5%B9%B4%E7%AC%AC31-32%E6%9C%9F%E5%90%88%E5%88%8A%E6%80%BB%E7%AC%AC31-32%E6%9C%9F/20251009-Picture03_hu_f37a4d02b7148ca6.jpg 480w, https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A2025%E5%B9%B4%E7%AC%AC31-32%E6%9C%9F%E5%90%88%E5%88%8A%E6%80%BB%E7%AC%AC31-32%E6%9C%9F/20251009-Picture03_hu_82c5451c2552bc3c.jpg 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;Installation view of Nour Jaouda，“How do we carry the endless blue?” (2025)，hand-dyed cotton canvas，steel (all photos Anna Souter/) 努尔·贾乌达（Nour Jaouda）作品“我们如何承载无尽的蓝色？”（2025）的装置图，手工染色棉帆布，钢（所有照片均由 Anna Souter/Hyperallergic 提供&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;160&#34;
		data-flex-basis=&#34;384px&#34;
	
&gt;&lt;/p&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-30&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        BRISTOL，England — It takes some bravery for a young artist offered a gallery the height of a warehouse to bring things down to a human level. For her first institutional solo show，Libyan artist Nour Jaouda erects a tent in the middle of Spike Island’s cavernous central gallery. Patterned with semi-abstracted botanical motifs，this hand-crafted fabric installation is emblematic of Jaouda’s ongoing exploration of the alternately transient，cyclical，and enduring nature of both a body of work and a landscape.
    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-30&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-31&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        Nevertheless，the idea of an installation as an intimate space to consider lost landscapes comes through powerfully. The tent is decorated with botanical motifs，including a partially abstracted rendering of the purple-petaled Faqqua iris，the national flower of Palestine. An emotive symbol of resistance，resilience，and hope，its presence also invokes the loss of lives，cultural heritage，and ecological diversity caused by Israel’s war and genocide in Gaza. There is something topographical about Jaouda’s textured textiles; the layering of earthy-colored panels suggests that land is a vulnerable yet enduring container for cultural memory.
    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-31&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;
&lt;h3 id=&#34;vertiginous-accounts-travels-in-the-air-1871-edition-眩晕的叙述空中旅行1871年版&#34;&gt;Vertiginous Accounts: Travels in the Air (1871 Edition) 眩晕的叙述：空中旅行（1871年版）
&lt;/h3&gt;&lt;div class=&#34;note-card&#34;&gt;
    &lt;div class=&#34;nc-accent&#34;&gt;&lt;/div&gt;

    &lt;div class=&#34;nc-header&#34;&gt;
        &lt;div class=&#34;nc-meta&#34;&gt;
            &lt;span class=&#34;nc-badge&#34;&gt;READING&lt;/span&gt;
            &lt;span class=&#34;nc-date&#34;&gt;2025-10-09&lt;/span&gt;
        &lt;/div&gt; &lt;a href=&#34;https://publicdomainreview.org/collection/travels-in-the-air&#34; target=&#34;_blank&#34; class=&#34;nc-title&#34; title=&#34;访问原文&#34;&gt;
            Vertiginous Accounts: Travels in the Air (1871 Edition) 眩晕的叙述：空中旅行（1871年版）
            &lt;svg class=&#34;nc-link-icon&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
        &lt;/a&gt;
    &lt;/div&gt;

    
    &lt;div class=&#34;nc-context&#34;&gt;
        &lt;div class=&#34;nc-quote-icon&#34;&gt;“&lt;/div&gt;
        &lt;div class=&#34;nc-summary-text&#34;&gt;这段文字描述了早期使用热气球升空的航空旅行者的探险经历。它讲述了他们勇敢飞向天空的旅程。&lt;/div&gt;
    &lt;/div&gt;
    

    
    
    
&lt;/div&gt;

&lt;style&gt;
     
    .note-card {
         
        --nc-bg-card: #ffffff;
        --nc-border: rgba(0,0,0,0.04);
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.08);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.12);
        
        --nc-title: #2c3e50;
        --nc-title-hover: #3a7bd5;
        --nc-meta: #999999;
        
        --nc-bg-context: #f8f9fa;
        --nc-border-context: #e2e8f0;
        --nc-quote-icon: #e2e8f0;
        --nc-text-summary: #555555;
        
        --nc-label-bg: #ffffff;
        --nc-label-text: #2d3748;
        --nc-content-text: #2d3748;
        --nc-link-icon: #cbd5e0;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.1);
        --nc-badge-text: #3a7bd5;

        position: relative;
        background: var(--nc-bg-card);
        border-radius: 12px;
        box-shadow: var(--nc-shadow);
        margin: 2.5rem 0;
        overflow: hidden;
        border: 1px solid var(--nc-border);
        font-family: inherit; 
        transition: transform 0.3s ease, box-shadow 0.3s ease, background 0.3s, border-color 0.3s;
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .note-card {
            --nc-bg-card: #1e1e1e;
            --nc-border: #333333;
            --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
            --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
            
            --nc-title: #f0f0f0;
            --nc-meta: #999999;
            
            --nc-bg-context: #252525;
            --nc-border-context: #444444;
            --nc-quote-icon: #333333;
            --nc-text-summary: #aaaaaa;
            
            --nc-label-bg: #1e1e1e;
            --nc-label-text: #cccccc;
            --nc-content-text: #dddddd;
            --nc-link-icon: #666666;
            
            --nc-badge-bg: rgba(58, 123, 213, 0.2);
        }
    }

    html[data-scheme=&#34;dark&#34;] .note-card {
        --nc-bg-card: #1e1e1e;
        --nc-border: #333333;
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
        
        --nc-title: #f0f0f0;
        --nc-meta: #999999;
        
        --nc-bg-context: #252525;
        --nc-border-context: #444444;
        --nc-quote-icon: #333333;
        --nc-text-summary: #aaaaaa;
        
        --nc-label-bg: #1e1e1e;
        --nc-label-text: #cccccc;
        --nc-content-text: #dddddd;
        --nc-link-icon: #666666;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.2);
    }

    .note-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--nc-shadow-hover);
    }

     
    .nc-accent {
        height: 4px;
        background: linear-gradient(90deg, #3a7bd5, #00d2ff); 
        width: 100%;
    }

     
    .nc-header {
        padding: 24px 28px 10px; 
    }

    .nc-meta {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 10px; 
        font-size: 13px; 
        color: var(--nc-meta);
        font-weight: 600;
        letter-spacing: 1px;
        text-transform: uppercase;
    }

    .nc-badge {
        color: var(--nc-badge-text);
        background: var(--nc-badge-bg);
        padding: 2px 6px;
        border-radius: 4px;
    }

    .nc-title {
        display: block;
        font-size: 2rem; 
        font-weight: 700;
        color: var(--nc-title);
        text-decoration: none;
        line-height: 1.3;
        transition: color 0.2s;
    }

    .nc-title:hover {
        color: var(--nc-title-hover);
    }

    .nc-link-icon {
        width: 20px; 
        height: 20px;
        color: var(--nc-link-icon);
        margin-left: 5px;
        vertical-align: middle;
        transition: color 0.2s;
    }

    .nc-title:hover .nc-link-icon {
        color: var(--nc-title-hover);
    }

     
    .nc-context {
        margin: 12px 28px 24px;
        background: var(--nc-bg-context);
        padding: 20px 24px;
        border-radius: 8px;
        position: relative;
        border-left: 4px solid var(--nc-border-context);
        transition: background 0.3s, border-color 0.3s;
    }

    .nc-quote-icon {
        position: absolute;
        top: 8px;
        left: 10px;
        font-family: serif; 
        font-size: 40px;
        line-height: 1;
        color: var(--nc-quote-icon);
        pointer-events: none;
        transition: color 0.3s;
    }

    .nc-summary-text {
        font-size: 1.7rem; 
        color: var(--nc-text-summary);
        line-height: 1.6;
        font-style: italic;
        position: relative;
        z-index: 1;
        padding-left: 15px; 
        transition: color 0.3s;
    }

     
    .nc-body {
        padding: 0 28px 32px;
        position: relative;
    }

     
    .nc-label {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        font-size: 13px; 
        font-weight: 700;
        color: var(--nc-label-text);
        background: var(--nc-label-bg);
        padding-right: 10px;
        margin-bottom: 12px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
        transition: color 0.3s, background 0.3s;
    }

    .nc-content {
        color: var(--nc-content-text);
        font-size: 1.6rem; 
        line-height: 1.75;
        transition: color 0.3s;
    }

     
    .nc-content p { margin-bottom: 1em; }
    .nc-content p:last-child { margin-bottom: 0; }
    
    .nc-content ul { padding-left: 20px; color: inherit; }
    .nc-content li { margin-bottom: 6px; }
&lt;/style&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-33&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        On a seaside holiday at Calais with his family in August 1869，French chemist and meteorologist Gaston Tissandier chanced to see a poster advertising a balloon launch from the central square the next day，as part of festivities celebrating Emperor Napoleon III. Going straight to the aeronaut’s hotel，he talked himself onto the voyage. Undaunted by wild nightmares of bursting balloons，his family’s strident pleas not to risk his life，and the blinding storm battering the coast，Tissandier arrived at the launch site at dawn，equipped only with life vests purchased from the Calais Humane Society. Despite a small trial balloon smashing into a bell tower and then being flung by the storm out over the wide expanse of the North Sea，the intrepid aeronauts jump into the wicker basket，a military band strikes up a march，and off the Neptune rises，4，000 feet in a single bound.
    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-33&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-34&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        Continuing west along the French coast until nightfall，they throw out the Neptune’s grapnel when they sight a lighthouse-bearing cape，and the balloon and basket smash into a sand dune，scattering a terrified flock of sheep and shepherds. The lighthouse keeper greets them and promptly informs them that they have come down but a few hundred yards from the tomb of Pilâtre de Rozier — the first human being ever to leave earth (in 1783) in a Montgolfier，and who also became humanity’s first air crash victim in this very same dune field but two years later.
    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-34&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;
&lt;h3 id=&#34;从敦煌艺术的地藏王菩萨说起&#34;&gt;从敦煌艺术的地藏王菩萨说起
&lt;/h3&gt;&lt;div class=&#34;note-card&#34;&gt;
    &lt;div class=&#34;nc-accent&#34;&gt;&lt;/div&gt;

    &lt;div class=&#34;nc-header&#34;&gt;
        &lt;div class=&#34;nc-meta&#34;&gt;
            &lt;span class=&#34;nc-badge&#34;&gt;READING&lt;/span&gt;
            &lt;span class=&#34;nc-date&#34;&gt;2025-10-09&lt;/span&gt;
        &lt;/div&gt; &lt;a href=&#34;https://m.thepaper.cn/detail/31651696&#34; target=&#34;_blank&#34; class=&#34;nc-title&#34; title=&#34;访问原文&#34;&gt;
            从敦煌艺术的地藏王菩萨说起
            &lt;svg class=&#34;nc-link-icon&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
        &lt;/a&gt;
    &lt;/div&gt;

    
    &lt;div class=&#34;nc-context&#34;&gt;
        &lt;div class=&#34;nc-quote-icon&#34;&gt;“&lt;/div&gt;
        &lt;div class=&#34;nc-summary-text&#34;&gt;地藏菩萨的艺术，尤其是在敦煌的艺术，强调了他的誓愿：“地狱不空，誓不成佛。” 图像描绘他手持如意宝珠和锡杖，常常伴有侍者和六道轮回的描绘。这些艺术品，许多来自敦煌文书，具有教化作用，阐释了佛教关于业力、轮回以及菩萨的慈悲救度众生免于苦难的教义。&lt;/div&gt;
    &lt;/div&gt;
    

    
    
    
&lt;/div&gt;

&lt;style&gt;
     
    .note-card {
         
        --nc-bg-card: #ffffff;
        --nc-border: rgba(0,0,0,0.04);
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.08);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.12);
        
        --nc-title: #2c3e50;
        --nc-title-hover: #3a7bd5;
        --nc-meta: #999999;
        
        --nc-bg-context: #f8f9fa;
        --nc-border-context: #e2e8f0;
        --nc-quote-icon: #e2e8f0;
        --nc-text-summary: #555555;
        
        --nc-label-bg: #ffffff;
        --nc-label-text: #2d3748;
        --nc-content-text: #2d3748;
        --nc-link-icon: #cbd5e0;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.1);
        --nc-badge-text: #3a7bd5;

        position: relative;
        background: var(--nc-bg-card);
        border-radius: 12px;
        box-shadow: var(--nc-shadow);
        margin: 2.5rem 0;
        overflow: hidden;
        border: 1px solid var(--nc-border);
        font-family: inherit; 
        transition: transform 0.3s ease, box-shadow 0.3s ease, background 0.3s, border-color 0.3s;
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .note-card {
            --nc-bg-card: #1e1e1e;
            --nc-border: #333333;
            --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
            --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
            
            --nc-title: #f0f0f0;
            --nc-meta: #999999;
            
            --nc-bg-context: #252525;
            --nc-border-context: #444444;
            --nc-quote-icon: #333333;
            --nc-text-summary: #aaaaaa;
            
            --nc-label-bg: #1e1e1e;
            --nc-label-text: #cccccc;
            --nc-content-text: #dddddd;
            --nc-link-icon: #666666;
            
            --nc-badge-bg: rgba(58, 123, 213, 0.2);
        }
    }

    html[data-scheme=&#34;dark&#34;] .note-card {
        --nc-bg-card: #1e1e1e;
        --nc-border: #333333;
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
        
        --nc-title: #f0f0f0;
        --nc-meta: #999999;
        
        --nc-bg-context: #252525;
        --nc-border-context: #444444;
        --nc-quote-icon: #333333;
        --nc-text-summary: #aaaaaa;
        
        --nc-label-bg: #1e1e1e;
        --nc-label-text: #cccccc;
        --nc-content-text: #dddddd;
        --nc-link-icon: #666666;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.2);
    }

    .note-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--nc-shadow-hover);
    }

     
    .nc-accent {
        height: 4px;
        background: linear-gradient(90deg, #3a7bd5, #00d2ff); 
        width: 100%;
    }

     
    .nc-header {
        padding: 24px 28px 10px; 
    }

    .nc-meta {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 10px; 
        font-size: 13px; 
        color: var(--nc-meta);
        font-weight: 600;
        letter-spacing: 1px;
        text-transform: uppercase;
    }

    .nc-badge {
        color: var(--nc-badge-text);
        background: var(--nc-badge-bg);
        padding: 2px 6px;
        border-radius: 4px;
    }

    .nc-title {
        display: block;
        font-size: 2rem; 
        font-weight: 700;
        color: var(--nc-title);
        text-decoration: none;
        line-height: 1.3;
        transition: color 0.2s;
    }

    .nc-title:hover {
        color: var(--nc-title-hover);
    }

    .nc-link-icon {
        width: 20px; 
        height: 20px;
        color: var(--nc-link-icon);
        margin-left: 5px;
        vertical-align: middle;
        transition: color 0.2s;
    }

    .nc-title:hover .nc-link-icon {
        color: var(--nc-title-hover);
    }

     
    .nc-context {
        margin: 12px 28px 24px;
        background: var(--nc-bg-context);
        padding: 20px 24px;
        border-radius: 8px;
        position: relative;
        border-left: 4px solid var(--nc-border-context);
        transition: background 0.3s, border-color 0.3s;
    }

    .nc-quote-icon {
        position: absolute;
        top: 8px;
        left: 10px;
        font-family: serif; 
        font-size: 40px;
        line-height: 1;
        color: var(--nc-quote-icon);
        pointer-events: none;
        transition: color 0.3s;
    }

    .nc-summary-text {
        font-size: 1.7rem; 
        color: var(--nc-text-summary);
        line-height: 1.6;
        font-style: italic;
        position: relative;
        z-index: 1;
        padding-left: 15px; 
        transition: color 0.3s;
    }

     
    .nc-body {
        padding: 0 28px 32px;
        position: relative;
    }

     
    .nc-label {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        font-size: 13px; 
        font-weight: 700;
        color: var(--nc-label-text);
        background: var(--nc-label-bg);
        padding-right: 10px;
        margin-bottom: 12px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
        transition: color 0.3s, background 0.3s;
    }

    .nc-content {
        color: var(--nc-content-text);
        font-size: 1.6rem; 
        line-height: 1.75;
        transition: color 0.3s;
    }

     
    .nc-content p { margin-bottom: 1em; }
    .nc-content p:last-child { margin-bottom: 0; }
    
    .nc-content ul { padding-left: 20px; color: inherit; }
    .nc-content li { margin-bottom: 6px; }
&lt;/style&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-36&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        敦煌的图本《佛说十王经》有8件（缀合为5件），敦煌文献中《佛说阎罗王受记令四众逆修生七斋功德往生净土经》共46件，缀合后为37件。两种经典都涉及到地藏王菩萨和十王信仰。
    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-36&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-37&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        在救苦救难这一点上，所有菩萨都在表达佛家的慈悲。六道轮回的思想曾经深入人心，地藏菩萨就以六种方式，隆重登场，分别往来于不同的世界，造型自然有所不同。于是就有了檀陀地藏、宝珠地藏、宝印地藏、持地地藏、除盖障地藏、日光地藏。经变画旨在教化，佛菩萨的形象，经典的故事，具有视觉冲击力的情境，令人过目难忘。
    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-37&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;
&lt;p&gt;&lt;img src=&#34;https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A2025%E5%B9%B4%E7%AC%AC31-32%E6%9C%9F%E5%90%88%E5%88%8A%E6%80%BB%E7%AC%AC31-32%E6%9C%9F/20251009-Picture04.jpg&#34;
	width=&#34;942&#34;
	height=&#34;1727&#34;
	srcset=&#34;https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A2025%E5%B9%B4%E7%AC%AC31-32%E6%9C%9F%E5%90%88%E5%88%8A%E6%80%BB%E7%AC%AC31-32%E6%9C%9F/20251009-Picture04_hu_f56f21676ac60ab0.jpg 480w, https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A2025%E5%B9%B4%E7%AC%AC31-32%E6%9C%9F%E5%90%88%E5%88%8A%E6%80%BB%E7%AC%AC31-32%E6%9C%9F/20251009-Picture04_hu_ee5444a669850060.jpg 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;敦煌第一批外流绢画 北宋 地藏王菩萨  现藏于弗利尔美术馆&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;54&#34;
		data-flex-basis=&#34;130px&#34;
	
&gt;&lt;/p&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-38&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        &lt;p&gt;美国弗利尔美术馆收藏的北宋时期九华山被帽地藏，特别鲜艳亮丽，在敦煌绘画中非常难得。此画在敦煌遗画中非常出名，因为是第一批从莫高窟藏经洞流失的敦煌绢画。1902年，当王道士从藏经洞中挑选了这几幅字画，徒步行走50里，去找敦煌县令和继任县令汪宗翰的时候，并未想到此画将流落日本、纽约，历经颠簸，漂洋过海，辗转多次，依然保存十分完美。&lt;/p&gt;
&lt;p&gt;主尊地藏菩萨侧身半跏坐，一脚赤裸，一脚穿人字拖，披帽，帽上的梅花非常时尚，左手托摩尼宝珠，右手似乎在指向旁边的和尚。和尚跪在地上，双手结印，满脸慈悲，上方榜题“道明和尚”，金毛狮子则满脸带笑，毛发清爽，形象十分可爱。&lt;/p&gt;
&lt;p&gt;这张敦煌绢画右上角题着“南无地藏菩萨”，下有“忌日画施”四个小字，说明是为亡人设福超度所画。唐朝至五代时期，受佛教轮回思想的影响，“五道大神”在民间信仰中广为流传，即冥界神灵五道将军；“五道将军”与中国古代的泰山府君、佛教的阎罗王司职相近，专掌地狱、鬼卒等事。下方右侧画着一个服饰华丽的女供养人，跪在红色的地毯上，一手拿花，一手端香，后有二位女童，榜题“故大朝大于阗金玉国天公主李氏供养”。可知画像为于阗国王李圣天第三女——圣天公主，嫁给归义军节度使曹延禄，此时已卒，此为忌日施画。地藏信仰中，尤其强调家族后人为先人的资福修慧。&lt;/p&gt;

    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-38&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-39&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        中国文化是求道的文化。尊道贵德，求真尚觉，乃是文化本怀，因此供奉地藏王菩萨的同时，也常常会供奉道明和尚和闵公。闵公父子与地藏王菩萨的奇妙因缘始于唐代：地藏王菩萨的化身新罗僧人金乔觉来华，当时地主闵公在九华山斋僧，金乔觉入席，正好补足一百之数。斋后，金乔觉向闵公请求化一袈裟之地来修行，闵公慨然应允。金乔觉向空中抛出袈裟，袈裟竟然覆盖了九个山头，闵公深悟空性，欣然捐出整座九华山，安徽池州的九华山因此而为地藏菩萨道场。闵公还让独子从金乔觉出家——这就是道明和尚。地藏菩萨两侧二侍者，右立者俗服，即闵公；左立者僧装，此即道明和尚；可见中国文化中抱本报恩的自觉，敬法敬僧的思想。
    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-39&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;
&lt;h3 id=&#34;访谈这批罕见姑苏版画何以被美国博物馆联手购藏&#34;&gt;访谈｜这批罕见姑苏版画何以被美国博物馆联手购藏
&lt;/h3&gt;&lt;div class=&#34;note-card&#34;&gt;
    &lt;div class=&#34;nc-accent&#34;&gt;&lt;/div&gt;

    &lt;div class=&#34;nc-header&#34;&gt;
        &lt;div class=&#34;nc-meta&#34;&gt;
            &lt;span class=&#34;nc-badge&#34;&gt;READING&lt;/span&gt;
            &lt;span class=&#34;nc-date&#34;&gt;2025-10-09&lt;/span&gt;
        &lt;/div&gt; &lt;a href=&#34;https://m.thepaper.cn/detail/31725067&#34; target=&#34;_blank&#34; class=&#34;nc-title&#34; title=&#34;访问原文&#34;&gt;
            访谈｜这批罕见姑苏版画何以被美国博物馆联手购藏
            &lt;svg class=&#34;nc-link-icon&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
        &lt;/a&gt;
    &lt;/div&gt;

    
    &lt;div class=&#34;nc-context&#34;&gt;
        &lt;div class=&#34;nc-quote-icon&#34;&gt;“&lt;/div&gt;
        &lt;div class=&#34;nc-summary-text&#34;&gt;克利夫兰艺术博物馆和大都会艺术博物馆联合从收藏家 Christer von der Burg 手中购得 220 件珍贵的 18 世纪苏州版画。这一重要的收购使两家机构成为研究这些版画的领先中心，这些版画展示了中国的印刷创新和跨文化艺术交流。该系列版画突显了苏州版画的精湛工艺和国际吸引力，欧洲技术对其创作产生了影响。&lt;/div&gt;
    &lt;/div&gt;
    

    
    
    
&lt;/div&gt;

&lt;style&gt;
     
    .note-card {
         
        --nc-bg-card: #ffffff;
        --nc-border: rgba(0,0,0,0.04);
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.08);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.12);
        
        --nc-title: #2c3e50;
        --nc-title-hover: #3a7bd5;
        --nc-meta: #999999;
        
        --nc-bg-context: #f8f9fa;
        --nc-border-context: #e2e8f0;
        --nc-quote-icon: #e2e8f0;
        --nc-text-summary: #555555;
        
        --nc-label-bg: #ffffff;
        --nc-label-text: #2d3748;
        --nc-content-text: #2d3748;
        --nc-link-icon: #cbd5e0;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.1);
        --nc-badge-text: #3a7bd5;

        position: relative;
        background: var(--nc-bg-card);
        border-radius: 12px;
        box-shadow: var(--nc-shadow);
        margin: 2.5rem 0;
        overflow: hidden;
        border: 1px solid var(--nc-border);
        font-family: inherit; 
        transition: transform 0.3s ease, box-shadow 0.3s ease, background 0.3s, border-color 0.3s;
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .note-card {
            --nc-bg-card: #1e1e1e;
            --nc-border: #333333;
            --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
            --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
            
            --nc-title: #f0f0f0;
            --nc-meta: #999999;
            
            --nc-bg-context: #252525;
            --nc-border-context: #444444;
            --nc-quote-icon: #333333;
            --nc-text-summary: #aaaaaa;
            
            --nc-label-bg: #1e1e1e;
            --nc-label-text: #cccccc;
            --nc-content-text: #dddddd;
            --nc-link-icon: #666666;
            
            --nc-badge-bg: rgba(58, 123, 213, 0.2);
        }
    }

    html[data-scheme=&#34;dark&#34;] .note-card {
        --nc-bg-card: #1e1e1e;
        --nc-border: #333333;
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
        
        --nc-title: #f0f0f0;
        --nc-meta: #999999;
        
        --nc-bg-context: #252525;
        --nc-border-context: #444444;
        --nc-quote-icon: #333333;
        --nc-text-summary: #aaaaaa;
        
        --nc-label-bg: #1e1e1e;
        --nc-label-text: #cccccc;
        --nc-content-text: #dddddd;
        --nc-link-icon: #666666;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.2);
    }

    .note-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--nc-shadow-hover);
    }

     
    .nc-accent {
        height: 4px;
        background: linear-gradient(90deg, #3a7bd5, #00d2ff); 
        width: 100%;
    }

     
    .nc-header {
        padding: 24px 28px 10px; 
    }

    .nc-meta {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 10px; 
        font-size: 13px; 
        color: var(--nc-meta);
        font-weight: 600;
        letter-spacing: 1px;
        text-transform: uppercase;
    }

    .nc-badge {
        color: var(--nc-badge-text);
        background: var(--nc-badge-bg);
        padding: 2px 6px;
        border-radius: 4px;
    }

    .nc-title {
        display: block;
        font-size: 2rem; 
        font-weight: 700;
        color: var(--nc-title);
        text-decoration: none;
        line-height: 1.3;
        transition: color 0.2s;
    }

    .nc-title:hover {
        color: var(--nc-title-hover);
    }

    .nc-link-icon {
        width: 20px; 
        height: 20px;
        color: var(--nc-link-icon);
        margin-left: 5px;
        vertical-align: middle;
        transition: color 0.2s;
    }

    .nc-title:hover .nc-link-icon {
        color: var(--nc-title-hover);
    }

     
    .nc-context {
        margin: 12px 28px 24px;
        background: var(--nc-bg-context);
        padding: 20px 24px;
        border-radius: 8px;
        position: relative;
        border-left: 4px solid var(--nc-border-context);
        transition: background 0.3s, border-color 0.3s;
    }

    .nc-quote-icon {
        position: absolute;
        top: 8px;
        left: 10px;
        font-family: serif; 
        font-size: 40px;
        line-height: 1;
        color: var(--nc-quote-icon);
        pointer-events: none;
        transition: color 0.3s;
    }

    .nc-summary-text {
        font-size: 1.7rem; 
        color: var(--nc-text-summary);
        line-height: 1.6;
        font-style: italic;
        position: relative;
        z-index: 1;
        padding-left: 15px; 
        transition: color 0.3s;
    }

     
    .nc-body {
        padding: 0 28px 32px;
        position: relative;
    }

     
    .nc-label {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        font-size: 13px; 
        font-weight: 700;
        color: var(--nc-label-text);
        background: var(--nc-label-bg);
        padding-right: 10px;
        margin-bottom: 12px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
        transition: color 0.3s, background 0.3s;
    }

    .nc-content {
        color: var(--nc-content-text);
        font-size: 1.6rem; 
        line-height: 1.75;
        transition: color 0.3s;
    }

     
    .nc-content p { margin-bottom: 1em; }
    .nc-content p:last-child { margin-bottom: 0; }
    
    .nc-content ul { padding-left: 20px; color: inherit; }
    .nc-content li { margin-bottom: 6px; }
&lt;/style&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-41&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        &lt;p&gt;美国克利夫兰艺术博物馆与纽约大都会艺术博物馆近期宣布联合购藏了一批18世纪的中国姑苏（苏州）版画，共220幅，数量宏富，制作精美。作为在中国绘画领域拥有深厚馆藏的知名博物馆，两馆此次各获得一百余幅姑苏版画，因之成为全球研究姑苏版画的顶尖机构，更充分体现了国际学界对姑苏版画艺术价值的高度肯定与推崇。英国木版教育信托主管郑海瑶女士（恺蒂）日前对这次收藏的主要负责人史明理博士（Dr Clarissa von Spee）进行了访谈。&lt;/p&gt;
&lt;p&gt;这批姑苏版画是著名收藏家冯德保先生（Christer von der Burg）的藏品，是他四十余年来悉心收藏的成果。冯德保先生为瑞典人，他是英国木版教育信托（原为欧洲木版基金会）的创始人、理事会主席。此机构位于伦敦，致力于研究、收藏、推广中国木刻版画，为注册公益机构。冯德保先生所收藏的姑苏版画，从数量、品类、质量来看，在全世界的私人收藏家中都属第一。&lt;/p&gt;
&lt;p&gt;克利夫兰艺术博物馆馆长威廉·格里斯沃尔德（William M. Griswold）表示：“我们很高兴能与大都会艺术博物馆的同仁携手完成这一独特收购，让两家机构有机会在各自的中国艺术馆藏背景下，将这些杰出的版画呈现给美国观众。” 博物馆的中国艺术部詹姆斯和唐娜·里德策展人（James and Donna Reid Curator）、伊斯兰艺术临时策展人兼亚洲艺术部主任史明理博士（Clarissa von Spee）是这次收购的主要负责人，她表示：“此次收藏对克利夫兰艺术博物馆的馆藏具有变革性的意义。这些版画让我们得以展现中国所发明的印刷术——比欧洲古腾堡印刷要早几个世纪——并且突出表现了多版套色印刷的创新成果。这批姑苏版画是对我们中国绘画馆藏的有力补充。”&lt;/p&gt;

    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-41&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-42&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        &lt;p&gt;恺蒂：首先祝贺克利夫兰与大都会艺术博物馆这次成功收购了冯德保先生所藏的二百二十幅十八世纪姑苏版画。我知道您很早就认识冯先生，也一直在关注他的收藏，能否请您谈谈此次大批购藏的过程。
史明理：我曾在伦敦的大英博物馆担任中国艺术策展人，那时我就认识冯德保先生。 2010年，我在大英博物馆策划了“中国版画：从八世纪到二十一世纪”（The Printed Image in China from the 8th to the 21st Centuries）大展，冯先生借展作品给我们。后来我前往克利夫兰艺术博物馆工作，并在2024年策划了“人间天堂——中国江南珍宝展”（China’s Southern Paradise - Treasures from the Lower Yangzi Delta），冯先生也为这个展览提供了藏品。这些年来我们一直保持联系，并成为了朋友。&lt;/p&gt;
&lt;p&gt;因此，十几年来，我就一直在关注冯先生的收藏活动，并与他多有交往。所以，当他决定出售他的姑苏版画收藏时，作为克利夫兰艺术博物馆的中国艺术策展人，我立即就表示对这批版画很感兴趣，博物馆对此也非常支持。这批版画相当重要，但要说服馆方进行如此巨大的投资，仍需要一段时间，博物馆此前从未系统性收藏过中国版画这一艺术门类。&lt;/p&gt;

    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-42&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-43&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        &lt;p&gt;恺蒂：克利夫兰艺术博物馆和大都会艺术博物馆共同进行了这次收购，请问你们是如何合作的？另外，两家机构共同收购并分享同一批藏品，这种情况常见吗？&lt;/p&gt;
&lt;p&gt;史明理：这批藏品共有二百二十幅姑苏版画，在艺术史上非常重要，但是价格也很高，我们感觉到，这次收购更适合两家机构共同承担，同时，我们也希望能保持冯先生藏品的完整性。所以，我就联系了大都会艺术博物馆。事实证明，他们是再合适不过的合作伙伴。大都会亚洲艺术部主任何慕文（ Mike Hearn） 曾在2012年将我在伦敦的“中国版画”展览引入大都会博物馆，展示给美国公众。这次，大都会博物馆的中国绘画策展人史耀华对我的提议立即表示赞同，他们二人以及大都会博物馆的馆长都认识到了这一批姑苏版画的重要性。&lt;/p&gt;
&lt;p&gt;与大都会合作的理由是多方面的。克利夫兰与大都会艺术博物馆两家机构都拥有世界一流的百科全书式收藏。两馆都具有保存这批版画的理想场所，而且我们也都同样致力于通过开放馆藏来为公众提供服务，所有人都可以实地到博物馆内来观看及研究藏品，我们也通过互联网向全球数百万用户提供数字服务。两馆都有中国书画修复及保护工作室，能够保证这批姑苏版画的长期保存，并在国际上树立起对版画保护的博物馆级的标准。&lt;/p&gt;
&lt;p&gt;此外，值得一提的是，我们两家机构都拥有亚洲艺术领域的专款捐赠的策展人和修复师的职位，这是非常罕见的，也就是说，两家博物馆负责中国书画的策展人和修复师的职位，都是由专门的捐赠款项设立的，都是永久性的职位，是永远不可能被取消的，所以我和史耀华的职位前都有前缀。对于保证这批姑苏版画的长期保存和展出来说，这一点尤为重要。几乎没有其他的博物馆是这样的情况。&lt;/p&gt;
&lt;p&gt;还有一点，我们两家博物馆也都是世界上最重要的借展机构之一。简而言之，克利夫兰和大都会艺术博物馆为保存、继承和发展冯先生所藏的姑苏版画提供了最理想的条件，这包括展览、学术研究与出版。因为这些版画对于光线非常敏感，所以，我们的展厅会定期轮换展出这些精美的作品，从而不断地以不同的语境和展览方式将它们呈现给公众。&lt;/p&gt;

    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-43&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-44&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        &lt;p&gt;恺蒂：那么，你们两家机构是如何分配这些版画的？是否有些作品两馆都希望能收藏？有没有产生争执？未来会不会进行作品的交换？&lt;/p&gt;
&lt;p&gt;史明理：如何在将这些作品公平分配给两家博物馆，这个任务落在我的肩上，因为我对这批版画最为熟悉。要将这些风格多样的精美版画分为两组，这件事并不容易。需要考虑的标准包括：形式和尺寸、制作这些版画的工作坊、版画的品相、题材、价值，还要保持那些整套作品的完整性。我先把这些版画分为两组，之后，大都会博物馆可以优先选择要哪一组，而我则希望自己不后悔他们的选择。当然，这两组不一定能够做到真正的平衡。事实上，这几乎是一件不可能完成的任务！当然，有很多版画两馆都非常希望能够得到，比如大都会博物馆的那套四张琴棋书画的姑苏文人美人图组画，还有克利夫兰的《西湖全景图》以及那幅精美的丁亮先的《石榴花上的鸟儿》。我不认为我们将来会交换版画，因为每件作品都已经在登记注册进入两馆的馆藏中。但我能肯定，在未来，我们会互相借展这些版画。&lt;/p&gt;

    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-44&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-45&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        &lt;p&gt;恺蒂：能否请您介绍一下姑苏版画，为什么它们如此重要？它们与中国木刻版画传统有什么样的关系？&lt;/p&gt;
&lt;p&gt;史明理：据目前所知，中国大约在公元七世纪发明了木版印刷；又在十七世纪初发展出多版套色木刻水印技法，这一工艺臻于成熟的多年之后，才传播到日本。十七世纪，印刷业在江南的许多城市蓬勃发展，例如南京、苏州、杭州和徽州等地，先是供私人收藏并欣赏的彩色插图本书籍，后来逐渐发展出更为商业化的单张木刻版画。人们把这些单张版画贴在或挂在墙上，它们成为城市视觉文化的一部分。
早期彩色木刻水印的经典作品包括《十竹斋书画谱》（约1633年）、《十竹斋笺谱》（约1644年）和《芥子园画传》（约1679、1701年）等，它们都是南京的文人参与制作的。这些经典画谱有多种版本，大家都很熟悉。这些作品很快流传到朝鲜和日本。套色木刻水印的顶峰是1720至1760年间，苏州丁氏工作坊制作了的许多单张版画。我们这次购藏的作品全部为十八世纪在苏州制作的版画，也就是姑苏版，它们代表了中国版画史上套色版画的最高成就。&lt;/p&gt;
&lt;p&gt;此外，值得一提的是，丁氏工作坊的花鸟、蔬果和古器版画中使用了拱花技法，这是一种凸版压印，能够产生鲜明的立体效果，增强了视觉印象。虽然我们知道这种技法早在《十竹斋笺谱》中已有应用，但在丁氏版画中更为明显与突出。即便三百多年过去，我们仍能在纸上看到这种浮雕般的质感！据我所知，不久之后，这一技法与风格便出现在日本版画家铃木春信（约1725–1770）的作品中，以其华丽的效果、优雅的格调和精致的用色而闻名。&lt;/p&gt;

    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-45&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-46&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        &lt;p&gt;恺蒂：这些版画大多在海外得以保留，有些作为室内墙壁的装饰被欧洲人保存，有些经日本收藏家之手传世，留存在中国本土的寥寥无几。我知道冯先生多年寻访这些版画，他的收藏过程中也有很多趣事。&lt;/p&gt;
&lt;p&gt;史明理：在收藏姑苏版画方面，冯德保先生是非常具有先驱性的，他经过了四十余年的收藏与积累，最终成为世界上拥有数量最多题材最完整的姑苏版画的私人收藏家。据大家所知，这些十八世纪的姑苏版画在中国本土几乎没有存留的，而美国机构也只是零星收藏过。冯德保先生是在欧洲及日本的私人收藏、家族收藏、庄园古堡、拍卖行中发现并购入这些单张版画的，他开始收藏时，根本没有学者研究姑苏版画，它们不被重视。冯德保先生毕生致力于寻找、研究并解释版画，并与全世界的研究人员及学者分享他的发现，这也逐渐引起了策展人与专家们的关注。&lt;/p&gt;
&lt;p&gt;至于收藏趣事，我记得冯先生曾告诉我，他在一只瑞典海员使用的木箱的盖子里发现了一张姑苏版画。此画可能由海员在中国购得，并将画贴在随身的箱盖上，随着箱子漂洋过海，最终到了瑞典。为了得到这幅版画，冯先生买下了那只木箱！&lt;/p&gt;

    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-46&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-47&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        &lt;p&gt;恺蒂：这批藏品许多尺寸很大，差不多有100×50厘米。大部分都是彩色的，一些采用了套色木刻印刷的工艺，另一些是黑白墨色印出之后，经手工上色彩绘而成。题材也是各种各样，非常丰富。是不是可以说冯先生的收藏非常全面？&lt;/p&gt;
&lt;p&gt;史明理：冯德保先生的收藏囊括了十八世纪套色版画的各种类型、形式与题材，使克利夫兰和大都会艺术博物馆得以向公众全方位地展示这一艺术门类。许多版画仿效更为昂贵的绘画的形式与技法，例如画上附有题诗和落款。这批版画的题材各种各样，包括古器、建筑景观、园林、城市风景、山水名胜、名媛仕女、花鸟、游戏、以及戏曲、小说故事和诗歌插图。尽管版画可以大量印制，但因其价格较低，一旦褪色或破损，往往就被弃置，所以存世的版画数量很小。这一批藏品中有些尺寸很大，有些装裱成挂轴。而丁氏工作坊的花鸟版画差不多是册页的大少，其中一些是现存孤品，例如克利夫兰博物馆的《姑苏美人&amp;ndash;夏日亭畔母子图》，就是唯一存世的例子。&lt;/p&gt;

    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-47&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-48&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        &lt;p&gt;恺蒂：这些版画在当年很流行，制作数量肯定不少，但在中国本土几乎没有留存，这难以让人理解。您认为原因是什么？&lt;/p&gt;
&lt;p&gt;史明理：据我们所知，苏州版画并不是外销品，它们当年的受众对象主要是江南城市富裕的市民家庭。版画是消耗品，人们购买之后，会把它们贴在或挂在墙上，或作为成套礼物送人，或作为纪念品购入。前面我说过，因为它们是批量制作的，而且价格低廉，所以一旦褪色或损坏，就会被弃置或更换。在中国，向来没有收藏版画、将其视为艺术品的传统，这可能是十八世纪姑苏版画没有在本土得以留存的主要原因。目前我们不完全清楚欧洲与日本的旅行者及商人们是如何获得这些版画的。不过，这些版画在欧洲城堡和宫殿中，作为墙饰而得以留存，这是事实，证明它们确实进入了欧洲，只是我们不清楚它们是通过什么渠道流入海外市场的。还有一些被日本人收藏、保存甚至摹仿，对日本版画有过很大的影响。&lt;/p&gt;

    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-48&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-49&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        &lt;p&gt;恺蒂：这些版画还有非常特别的一点，就是大量使用了欧洲绘画的视觉技法，采用交点透视法和排线法来表现光影与体积。欧洲绘画早在几个世纪前已传入中国，但其影响主要局限于在宫廷。是不是可以说，随着姑苏版画的兴起，西方绘画的技法也得以被中上层的市民家庭欣赏，可以说当时的视觉文化非常国际化。&lt;/p&gt;
&lt;p&gt;史明理：苏州及其工坊的工匠们与北京的官员和宫廷画师，以及传教士和基督徒有着密切的联系与交流。耶稣会士或其他外国人也常常会把新的潮流与新奇的事物介绍到北京的宫廷，这些会很快传出，被南方版画制作者采纳并使用。&lt;/p&gt;
&lt;p&gt;这些艺术上的新技法包括源自欧洲铜版画的排线阴影技法，还有交点透视法，我们可以在人物、建筑、山水和城市景观中看到这种表现。十八世纪的苏州不仅在都市时尚方面引领潮流，也在工艺上成为风向标，从而使这些新技法传播到整个中国。&lt;/p&gt;

    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-49&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-50&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        &lt;p&gt;恺蒂：姑苏版画的传统是否延续到十九二十世纪？&lt;/p&gt;
&lt;p&gt;史明理：十九世纪的中国依然充满创造力，但鸦片战争严重影响了人们的生活以及人们对奢侈品消费的需求，特别是在江南港口城市，例如镇江、南京、上海和宁波等地，版画工作坊也受到了很大打击。随后爆发的太平天国运动更是摧毁了整个东南地区，十九世纪下半叶，人们对消费与商业的需求骤减。二十世纪时，印刷业再次兴盛，尤其在上海和北京地区，也开启了中国版画史的新篇章。&lt;/p&gt;

    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-50&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-51&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        &lt;p&gt;恺蒂：姑苏版画有许多对绘画的模仿，但又不同于绘画，它们的叙事性、人物建筑的细节等都很出色，无疑会给中国绘画的研究和收藏带来新的视角，收藏这批版画，可以说是对绘画收藏的很大补充吧？&lt;/p&gt;
&lt;p&gt;史明理：是的，这批版画进入馆藏，让克利夫兰博物馆跻身于全球苏州版画研究的首选机构之一。这些新入藏的版画与绘画关系密切，常常模仿绘画，将为我们的杰出中国绘画收藏带来新的启示、新的关注和更全面的理解。此外，这批作品使博物馆能够展示中国在印刷术上的发明——远早于德国古腾堡的活字印刷术。此次收购还突出了中国在彩色印刷方面的发展，印刷和彩色印刷这两大发明对全球历史都具有重大意义。&lt;/p&gt;

    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-51&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-52&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        &lt;p&gt;恺蒂：您能否介绍一下这批作品的展出与出版计划。&lt;/p&gt;
&lt;p&gt;史明理：博物馆计划在2026年11月至2027年5月举办展览“版画革命：1630s–1960s 的中国印象”（Print Revolutions. Chinese impressions，1630s-1960s）（暂定名），展览将横跨三个展厅，展出六十余幅版画，并同时举行一次国际会议。展览还将与2027年4月举行的克利夫兰艺术博物馆版画博览会同期进行。该博览会由1919年成立的克利夫兰版画协会主办，每年在博物馆宽敞的中庭举行，汇集来自美国各地的版画画廊。此外，博物馆还计划举办版画演示，并邀请冯先生举行公开讲座。这次展览不仅将庆祝博物馆的新收藏，还将纪念冯德保在伦敦成立的欧洲木版基金会（现为木版教育信托），恰好三十周年。&lt;/p&gt;

    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-52&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-53&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        &lt;p&gt;恺蒂：对，1997年，冯先生和博林德女士一起创立了木版基金会，完全是出于对于中国木刻版画的钟爱。1997-2003年之间，他们十七次前往中国，走访各大美术学院，结识了无数位中国版画艺术家，收藏了六千多幅1940年之后的现当代木刻版画作品，邀请六十位中国版画家创作了一套原作集，并在大英图书馆举办了版画大展，这些都是大手笔的里程碑式的举动。2009年，基金会改名为木版教育信托，仍然一直活跃于版画领域，我们的现当代版画收藏向世界各地的公众及研究人员开放，我们与大小博物馆合作举办展览，参加各种艺术博览会，我们还设立了木版奖，为年轻一代的版画家提供走向世界的平台，我们也一直得到您与克利夫兰艺术博物馆的支持。这一切，都缘起于冯先生这位了不起的收藏家。&lt;/p&gt;
&lt;p&gt;史明理：冯先生具有收藏家的好奇心与直觉，他也是这一领域的专家，他很有耐心、很执着，而且，他拥有精湛的商业意识。这些特点加在一起，就让他拥有了最重要的中国版画的私人收藏。此外，冯先生是亚洲文化的大家，他知识渊博，与全球的学者和业内的人士有着友好的关系，他非常慷慨地分享他的热情和发现，共同推动学术研究。&lt;/p&gt;
&lt;p&gt;冯先生最初是一位善本书商，后来涉足中国古籍与版画收藏，并创立了木板教育信托这一机构，推动中国版画的研究与发展。令人赞叹的是，冯先生为中国的版画创造了一个国际市场。如果没有他，这些版画可能仍在书商及拍卖行中流转，无法获得应有的关注。版画可以向人们传递视觉文化的重要信息，展示艺术家们的创造力以及中国文化辉煌的历史。&lt;/p&gt;

    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-53&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-54&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        恺蒂：最后，我想引用冯德保先生对此次购藏的感言。冯先生在邮件中写道：“虽然与多年来一直伴随我的藏品分手让我有些不舍，但我的收藏能够找到如此杰出的两家永久归属地，我深感欣慰与自豪。我相信，今后能有更多的公众和学者得以欣赏、研究这些作品。这二百二十幅版画是《欧洲冯氏藏中国姑苏版画》中收入的全部作品。该书由我与翁连溪先生合著，近期将由北京的文物出版社出版。因为此书编写计划已经有几年时间，所以这批版画的收藏也有个截止日期。在这几年中，我依然继续收藏姑苏版画，不断有很多优秀的作品进入市场，目前我已经积累了一百八十多张，同样精美无比，各类作品齐全，质量上乘。我正在进行编目，撰写研究文章。等到恰当时刻，我也希望能有其他博物馆机构，成为他们的永久之家。这批版画我是不打算拆散，如果有中国的博物馆或机构拥有前瞻及睿智的眼光，仿效克利夫兰及大都会的先例，收藏这批版画，与他们鼎足而立，这将是我最大的心愿。现在已经有一些中国私人藏家开始关注姑苏版画的收藏，但在公众机构中，姑苏版画依然极为罕见。姑苏版画终究是应该属于中国的。”
    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-54&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;
&lt;p&gt;&lt;img src=&#34;https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A2025%E5%B9%B4%E7%AC%AC31-32%E6%9C%9F%E5%90%88%E5%88%8A%E6%80%BB%E7%AC%AC31-32%E6%9C%9F/20251009-Picture05.jpg&#34;
	width=&#34;800&#34;
	height=&#34;1124&#34;
	srcset=&#34;https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A2025%E5%B9%B4%E7%AC%AC31-32%E6%9C%9F%E5%90%88%E5%88%8A%E6%80%BB%E7%AC%AC31-32%E6%9C%9F/20251009-Picture05_hu_8aaa233d80cf298b.jpg 480w, https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A2025%E5%B9%B4%E7%AC%AC31-32%E6%9C%9F%E5%90%88%E5%88%8A%E6%80%BB%E7%AC%AC31-32%E6%9C%9F/20251009-Picture05_hu_8fb7da3d581fd3b3.jpg 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;《欧洲冯氏藏中国姑苏版画》，文物出版社&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;71&#34;
		data-flex-basis=&#34;170px&#34;
	
&gt;&lt;/p&gt;
&lt;h3 id=&#34;nyc-removes-worlds-fairs-mosaicsa-slice-of-queens-art-history-纽约拆除世界博览会马赛克一段皇后区艺术史的片段&#34;&gt;NYC Removes World’s Fairs Mosaics，a Slice of Queens Art History 纽约拆除世界博览会马赛克，一段皇后区艺术史的片段
&lt;/h3&gt;&lt;div class=&#34;note-card&#34;&gt;
    &lt;div class=&#34;nc-accent&#34;&gt;&lt;/div&gt;

    &lt;div class=&#34;nc-header&#34;&gt;
        &lt;div class=&#34;nc-meta&#34;&gt;
            &lt;span class=&#34;nc-badge&#34;&gt;READING&lt;/span&gt;
            &lt;span class=&#34;nc-date&#34;&gt;2025-10-09&lt;/span&gt;
        &lt;/div&gt; &lt;a href=&#34;https://hyperallergic.com/1046874/nyc-removes-worlds-fairs-mosaics-a-slice-of-queens-art-history/&#34; target=&#34;_blank&#34; class=&#34;nc-title&#34; title=&#34;访问原文&#34;&gt;
            NYC Removes World’s Fairs Mosaics，a Slice of Queens Art History 纽约拆除世界博览会马赛克，一段皇后区艺术史的片段
            &lt;svg class=&#34;nc-link-icon&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
        &lt;/a&gt;
    &lt;/div&gt;

    
    &lt;div class=&#34;nc-context&#34;&gt;
        &lt;div class=&#34;nc-quote-icon&#34;&gt;“&lt;/div&gt;
        &lt;div class=&#34;nc-summary-text&#34;&gt;纽约法拉盛草原可乐娜公园的马赛克艺术品于1997年为纪念世界博览会而安装，但因天气损坏和安全隐患而被移除。这些艺术品，包括一幅参考安迪·沃霍尔1964年颇具争议的世界博览会作品的马赛克，以及向萨尔瓦多·达利和艾尔茜奶牛致敬的作品，现已不复存在。居民们正在倡导修复或用教育展览取而代之。&lt;/div&gt;
    &lt;/div&gt;
    

    
    
    
&lt;/div&gt;

&lt;style&gt;
     
    .note-card {
         
        --nc-bg-card: #ffffff;
        --nc-border: rgba(0,0,0,0.04);
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.08);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.12);
        
        --nc-title: #2c3e50;
        --nc-title-hover: #3a7bd5;
        --nc-meta: #999999;
        
        --nc-bg-context: #f8f9fa;
        --nc-border-context: #e2e8f0;
        --nc-quote-icon: #e2e8f0;
        --nc-text-summary: #555555;
        
        --nc-label-bg: #ffffff;
        --nc-label-text: #2d3748;
        --nc-content-text: #2d3748;
        --nc-link-icon: #cbd5e0;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.1);
        --nc-badge-text: #3a7bd5;

        position: relative;
        background: var(--nc-bg-card);
        border-radius: 12px;
        box-shadow: var(--nc-shadow);
        margin: 2.5rem 0;
        overflow: hidden;
        border: 1px solid var(--nc-border);
        font-family: inherit; 
        transition: transform 0.3s ease, box-shadow 0.3s ease, background 0.3s, border-color 0.3s;
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .note-card {
            --nc-bg-card: #1e1e1e;
            --nc-border: #333333;
            --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
            --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
            
            --nc-title: #f0f0f0;
            --nc-meta: #999999;
            
            --nc-bg-context: #252525;
            --nc-border-context: #444444;
            --nc-quote-icon: #333333;
            --nc-text-summary: #aaaaaa;
            
            --nc-label-bg: #1e1e1e;
            --nc-label-text: #cccccc;
            --nc-content-text: #dddddd;
            --nc-link-icon: #666666;
            
            --nc-badge-bg: rgba(58, 123, 213, 0.2);
        }
    }

    html[data-scheme=&#34;dark&#34;] .note-card {
        --nc-bg-card: #1e1e1e;
        --nc-border: #333333;
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
        
        --nc-title: #f0f0f0;
        --nc-meta: #999999;
        
        --nc-bg-context: #252525;
        --nc-border-context: #444444;
        --nc-quote-icon: #333333;
        --nc-text-summary: #aaaaaa;
        
        --nc-label-bg: #1e1e1e;
        --nc-label-text: #cccccc;
        --nc-content-text: #dddddd;
        --nc-link-icon: #666666;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.2);
    }

    .note-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--nc-shadow-hover);
    }

     
    .nc-accent {
        height: 4px;
        background: linear-gradient(90deg, #3a7bd5, #00d2ff); 
        width: 100%;
    }

     
    .nc-header {
        padding: 24px 28px 10px; 
    }

    .nc-meta {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 10px; 
        font-size: 13px; 
        color: var(--nc-meta);
        font-weight: 600;
        letter-spacing: 1px;
        text-transform: uppercase;
    }

    .nc-badge {
        color: var(--nc-badge-text);
        background: var(--nc-badge-bg);
        padding: 2px 6px;
        border-radius: 4px;
    }

    .nc-title {
        display: block;
        font-size: 2rem; 
        font-weight: 700;
        color: var(--nc-title);
        text-decoration: none;
        line-height: 1.3;
        transition: color 0.2s;
    }

    .nc-title:hover {
        color: var(--nc-title-hover);
    }

    .nc-link-icon {
        width: 20px; 
        height: 20px;
        color: var(--nc-link-icon);
        margin-left: 5px;
        vertical-align: middle;
        transition: color 0.2s;
    }

    .nc-title:hover .nc-link-icon {
        color: var(--nc-title-hover);
    }

     
    .nc-context {
        margin: 12px 28px 24px;
        background: var(--nc-bg-context);
        padding: 20px 24px;
        border-radius: 8px;
        position: relative;
        border-left: 4px solid var(--nc-border-context);
        transition: background 0.3s, border-color 0.3s;
    }

    .nc-quote-icon {
        position: absolute;
        top: 8px;
        left: 10px;
        font-family: serif; 
        font-size: 40px;
        line-height: 1;
        color: var(--nc-quote-icon);
        pointer-events: none;
        transition: color 0.3s;
    }

    .nc-summary-text {
        font-size: 1.7rem; 
        color: var(--nc-text-summary);
        line-height: 1.6;
        font-style: italic;
        position: relative;
        z-index: 1;
        padding-left: 15px; 
        transition: color 0.3s;
    }

     
    .nc-body {
        padding: 0 28px 32px;
        position: relative;
    }

     
    .nc-label {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        font-size: 13px; 
        font-weight: 700;
        color: var(--nc-label-text);
        background: var(--nc-label-bg);
        padding-right: 10px;
        margin-bottom: 12px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
        transition: color 0.3s, background 0.3s;
    }

    .nc-content {
        color: var(--nc-content-text);
        font-size: 1.6rem; 
        line-height: 1.75;
        transition: color 0.3s;
    }

     
    .nc-content p { margin-bottom: 1em; }
    .nc-content p:last-child { margin-bottom: 0; }
    
    .nc-content ul { padding-left: 20px; color: inherit; }
    .nc-content li { margin-bottom: 6px; }
&lt;/style&gt;
&lt;h3 id=&#34;王翔评文弱书生古典才子与当代阳刚&#34;&gt;王翔评《文弱书生》｜古典才子与当代阳刚
&lt;/h3&gt;&lt;div class=&#34;note-card&#34;&gt;
    &lt;div class=&#34;nc-accent&#34;&gt;&lt;/div&gt;

    &lt;div class=&#34;nc-header&#34;&gt;
        &lt;div class=&#34;nc-meta&#34;&gt;
            &lt;span class=&#34;nc-badge&#34;&gt;READING&lt;/span&gt;
            &lt;span class=&#34;nc-date&#34;&gt;2025-10-09&lt;/span&gt;
        &lt;/div&gt; &lt;a href=&#34;https://www.thepaper.cn/newsDetail_forward_31730853&#34; target=&#34;_blank&#34; class=&#34;nc-title&#34; title=&#34;访问原文&#34;&gt;
            王翔评《文弱书生》｜古典才子与当代阳刚
            &lt;svg class=&#34;nc-link-icon&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
        &lt;/a&gt;
    &lt;/div&gt;

    
    &lt;div class=&#34;nc-context&#34;&gt;
        &lt;div class=&#34;nc-quote-icon&#34;&gt;“&lt;/div&gt;
        &lt;div class=&#34;nc-summary-text&#34;&gt;这篇书评讨论了《脆弱的学者：前现代中国的男性气质》，该书通过“才子”原型分析了古代中国的男性气质。本书认为，男性气质并非固有的，而是社会建构的，受仪式、文本和权力塑造。它批判了西方的男性气质观念，认为传统中国“女性化”的特质并非缺乏权力，而是另一种合法的男性表达形式，通常与智力和美德相关。书评强调了该书对理解当代男性身份认同焦虑的贡献。&lt;/div&gt;
    &lt;/div&gt;
    

    
    
    
&lt;/div&gt;

&lt;style&gt;
     
    .note-card {
         
        --nc-bg-card: #ffffff;
        --nc-border: rgba(0,0,0,0.04);
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.08);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.12);
        
        --nc-title: #2c3e50;
        --nc-title-hover: #3a7bd5;
        --nc-meta: #999999;
        
        --nc-bg-context: #f8f9fa;
        --nc-border-context: #e2e8f0;
        --nc-quote-icon: #e2e8f0;
        --nc-text-summary: #555555;
        
        --nc-label-bg: #ffffff;
        --nc-label-text: #2d3748;
        --nc-content-text: #2d3748;
        --nc-link-icon: #cbd5e0;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.1);
        --nc-badge-text: #3a7bd5;

        position: relative;
        background: var(--nc-bg-card);
        border-radius: 12px;
        box-shadow: var(--nc-shadow);
        margin: 2.5rem 0;
        overflow: hidden;
        border: 1px solid var(--nc-border);
        font-family: inherit; 
        transition: transform 0.3s ease, box-shadow 0.3s ease, background 0.3s, border-color 0.3s;
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .note-card {
            --nc-bg-card: #1e1e1e;
            --nc-border: #333333;
            --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
            --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
            
            --nc-title: #f0f0f0;
            --nc-meta: #999999;
            
            --nc-bg-context: #252525;
            --nc-border-context: #444444;
            --nc-quote-icon: #333333;
            --nc-text-summary: #aaaaaa;
            
            --nc-label-bg: #1e1e1e;
            --nc-label-text: #cccccc;
            --nc-content-text: #dddddd;
            --nc-link-icon: #666666;
            
            --nc-badge-bg: rgba(58, 123, 213, 0.2);
        }
    }

    html[data-scheme=&#34;dark&#34;] .note-card {
        --nc-bg-card: #1e1e1e;
        --nc-border: #333333;
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
        
        --nc-title: #f0f0f0;
        --nc-meta: #999999;
        
        --nc-bg-context: #252525;
        --nc-border-context: #444444;
        --nc-quote-icon: #333333;
        --nc-text-summary: #aaaaaa;
        
        --nc-label-bg: #1e1e1e;
        --nc-label-text: #cccccc;
        --nc-content-text: #dddddd;
        --nc-link-icon: #666666;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.2);
    }

    .note-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--nc-shadow-hover);
    }

     
    .nc-accent {
        height: 4px;
        background: linear-gradient(90deg, #3a7bd5, #00d2ff); 
        width: 100%;
    }

     
    .nc-header {
        padding: 24px 28px 10px; 
    }

    .nc-meta {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 10px; 
        font-size: 13px; 
        color: var(--nc-meta);
        font-weight: 600;
        letter-spacing: 1px;
        text-transform: uppercase;
    }

    .nc-badge {
        color: var(--nc-badge-text);
        background: var(--nc-badge-bg);
        padding: 2px 6px;
        border-radius: 4px;
    }

    .nc-title {
        display: block;
        font-size: 2rem; 
        font-weight: 700;
        color: var(--nc-title);
        text-decoration: none;
        line-height: 1.3;
        transition: color 0.2s;
    }

    .nc-title:hover {
        color: var(--nc-title-hover);
    }

    .nc-link-icon {
        width: 20px; 
        height: 20px;
        color: var(--nc-link-icon);
        margin-left: 5px;
        vertical-align: middle;
        transition: color 0.2s;
    }

    .nc-title:hover .nc-link-icon {
        color: var(--nc-title-hover);
    }

     
    .nc-context {
        margin: 12px 28px 24px;
        background: var(--nc-bg-context);
        padding: 20px 24px;
        border-radius: 8px;
        position: relative;
        border-left: 4px solid var(--nc-border-context);
        transition: background 0.3s, border-color 0.3s;
    }

    .nc-quote-icon {
        position: absolute;
        top: 8px;
        left: 10px;
        font-family: serif; 
        font-size: 40px;
        line-height: 1;
        color: var(--nc-quote-icon);
        pointer-events: none;
        transition: color 0.3s;
    }

    .nc-summary-text {
        font-size: 1.7rem; 
        color: var(--nc-text-summary);
        line-height: 1.6;
        font-style: italic;
        position: relative;
        z-index: 1;
        padding-left: 15px; 
        transition: color 0.3s;
    }

     
    .nc-body {
        padding: 0 28px 32px;
        position: relative;
    }

     
    .nc-label {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        font-size: 13px; 
        font-weight: 700;
        color: var(--nc-label-text);
        background: var(--nc-label-bg);
        padding-right: 10px;
        margin-bottom: 12px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
        transition: color 0.3s, background 0.3s;
    }

    .nc-content {
        color: var(--nc-content-text);
        font-size: 1.6rem; 
        line-height: 1.75;
        transition: color 0.3s;
    }

     
    .nc-content p { margin-bottom: 1em; }
    .nc-content p:last-child { margin-bottom: 0; }
    
    .nc-content ul { padding-left: 20px; color: inherit; }
    .nc-content li { margin-bottom: 6px; }
&lt;/style&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-57&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        &lt;p&gt;在近年来的中文互联网世界，“阳刚”话语被一次次重置：从热门视频中的铁血想象，到资本成功学里的强势语气；从“少年感”的妆造，到“硬核科技”的修辞——看似各说各话，其实都在争论一个问题：谁有权界定“何为男人”？那么，理想中的中国男性到底是怎样的？是“高富帅”“小鲜肉”，还是“霸道总裁”“经济适用男”？现实中的中国男性又是什么样的？“直男癌”“娘炮”还是“普信男”？这些都涉及一个基本问题：有没有（以及什么是）中国式的男性气概？脱口秀演员张骏前不久调侃，“直男癌”的早期症状是“直男炎”，主要症状就是老发炎（言）。所以，出版一本关于中国男性气概的书籍，不仅需要深厚扎实的学术功底，更需要直面“拳”打脚踢的勇气。&lt;/p&gt;
&lt;p&gt;面对新近译介的《文弱书生：前现代中国的男性气概》，我仿佛翻开了一幅绵密的“性别-权力”图谱。这部专著以“才子”这一颇具文化意蕴的男性形象为中心，在权力与审美的交织中重建了古代中国男性气概的谱系。作者提醒我们：男性气质从不是天赋本质，而是由礼制、文本、舞台与权力共同“生产”的。理解了“才子”作为男性气质正当形象的历史根源，我们也就更能读懂当下中国男性对自身形象的焦虑：它并非道德真理之争，而是权力话语与规训装置的位移。我们应该思考的不是谁够不够男人，而是谁在形塑“男人”。&lt;/p&gt;

    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-57&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-58&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        &lt;p&gt;首先，何为“文弱书生”？其并非自然存在的人群，而是在元明清的“爱情叙事—戏曲舞台—市民审美”三者交织中建构而成的类型化男性。所谓“阴柔”并非简单的“欠阳刚”，而是在特定历史语境中经由权力与礼制锚定的一种合理化气质。作者梳理了“小生”近年来在中西语境中遭到误读并被贬称为“娘炮”的过程，强调只有从其生成环境出发，才能理解纤弱身体如何成为文化合法的“男性美”。如《西厢记》中的张生等典型形象所代表的，“文弱书生”既是才华横溢、外貌秀美而近女性之姿，又隐含着“情深义重而易受挫”的性格。&lt;/p&gt;
&lt;p&gt;接着，作者延续福柯式的谱系学研究方法，追溯文弱书生的历史踪迹。从屈原以“香草美人”自喻的“自伤其身”到唐传奇的女装英雄，再到元杂剧小生声腔最终定型。这种身体政治指向的是帝国权力链上阴阳位置的流变：同一主体在不同关系中可以切换位置，能臣遭遇皇权时可向上为“阴”，向下为“阳”，这也提供了解释前现代文学中男性“女口奏章”现象的线索。作者进一步指出，西方殖民话语把非西方男性塑造成女性化他者，然而在中国传统中，阴柔并不意味着失权，反而与文才与品德相连，这为后文质疑“男性危机”提供了历史参照。&lt;/p&gt;
&lt;p&gt;作者借助福柯的身体政治理论指出，宋代以后科举制度与儒家礼仪共同塑造了一种驯服的男性身体，清瘦、白皙、温润成为才子形象的主流标识。制度与礼仪不仅规范人们的言行，还将人的身体塑造成可度量、可管理的“驯服身体”。这种身体既是文本性（能写会吟）的物质载体，也是将德行内化为身体惯习的重要机制。作者强调，这类身体技术的背后是政治-权力的实践，与西方常见的通过体育训练强化肌肉的阳刚模式不同，这种“驯服”体现了将学识与美德内化的阳刚形态。&lt;/p&gt;

    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-58&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-59&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        为什么在中国前现代文学中，被西方视角视为“女性化”或“非典型”的“文弱书生”形象，能被本土文化广泛接受为浪漫英雄与男性气质的理想典范？“才子”并非阳刚的对立面，而是一种被科举、礼仪、文本与舞台行当共同“生产”的合法男性气质。“文弱书生”的气质既不是纯粹的反叛，也不是被动的顺从，而是在权力的场域内生产，在叙事的缝隙里周旋。不过，才子气质的“反抗性”恰恰是其“被规训性”的最高体现。它是一种在文化规训内部开辟出的身份与意义再阐释的“第三空间”（霍米·巴巴）。文人阶层通过主动拥抱“脆弱”，将权力结构的压迫转化为文化资本的积累，在象征层面实现对权力的“柔弱制胜”的同时也完成了其自身的献祭。这种策略既深刻受制于时代规训，又闪烁着主体性的微光，正是前现代中国文人精神世界的复杂缩影。
    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-59&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-60&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        &lt;p&gt;一直以来，存在一种“东方男子=柔弱/阴性”的西方想象。华裔男演员尊龙主演的电影《蝴蝶君》是一典型。电影讲述了法国外交官高仁尼与中国男旦宋丽玲之间的情感纠葛。高仁尼对宋丽玲的迷恋就是典型的东方主义幻想——他将宋丽玲视为一个神秘、顺从、充满异域风情的他者，并试图通过占有“她”来满足自己的男性自大和殖民欲望。然而，宋丽玲非但不是高仁尼想象中的“蝴蝶夫人”，反而是一个具有强大主体性的反抗者，他利用了高仁尼的东方主义偏见，最终反噬了高仁尼。与电影一样，《文弱书生》同样回应了西方对中国男性“阴柔化”的东方主义凝视与想象。&lt;/p&gt;
&lt;p&gt;本书的最大贡献在于挑战了将西方霸权男性气质（hegemonic masculinity）视为普适范式的倾向。“霸权男性气质既不是与生俱来的，也不是放之四海而皆准的，它是一定历史时期、一定意识形态的产物，并为父权制和男性在社会中的主导地位服务”。西方理论将男性气概建构在“男性/女性”及“反女性”的二元划分上，而作者指出，前现代中国的“才子阳刚”并非“未达标的男性”，而是在阴/阳权力链和文/武谱系中自洽、具有政治和审美正当性的男性范型。男性气概的核心不是肌肉，而是文采与德行，这一发现为男性研究提供了去中心化的东方经验。&lt;/p&gt;
&lt;p&gt;西方理论将一个社会中的男性气质区分为“霸权”“从属”“边缘”三个类别，男性特质的支配性定义是四条“硬汉守则”：拒绝女性化，做个大人物，管控情绪，冒险性与进攻性。本书并非一概否定这一框架的解释力，而是通过前现代中国的性别话语（尤其“阴/阳”与“文/武”），对它做必要的“去普遍化”处理：在传统中国，“阴/阳”并非“男/女”的简单对译，而是权力位置的可变关系项；同一主体在不同权力关系中可处于阴位或阳位，故而“性别”的政治性往往先于并压过“性”的二元刻写。正如书中所引文献指出的，“在中国，性别符号往往是等而下之的，更重要的原则来自道德和社会生活”。“硬汉守则”并非男性气质的“常量”，“柔弱—多情—可伤”也可在特定文化政治中成为被嘉许的男子气，只是其合法性不源于“阳刚本质”，而是来自权力的编排方式。&lt;/p&gt;

    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-60&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-61&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        &lt;p&gt;由此可以得出几条关键修正：其一，前现代中国并不以“男/女—异/同”为二元来组织社会象征秩序，许多场合中“性别角色”服从于亲属、年龄、地域、等级等更高阶的社会原则。作为西方性别话语和整个符号系统核心观念的男/女二元分野，对前现代中国社会并不完全适用。其二，作为“理想男性身体”的“瘦弱/柔敏”并非对阳刚的背反，而是与“文”之权力、教化与文本性深度耦合的身体技艺，福柯式“驯顺的身体”在此获得了在地化阐释。其三，既然“阴/阳”是权力关系学，那么“同-异”之分无法像现代西方那样，与“男-女/阳-阴”稳定对位。这也解释了为何中国文学中的柔美男体既可入异性恋的“才子-佳人”叙事，又能与男-男情欲的修辞彼此通气，而不必立即触发“去男性化”的惩罚机制。&lt;/p&gt;
&lt;p&gt;电影《蝴蝶君》中宋丽玲的“女性化”表演，并非其男性气概的缺失，而是一种策略性的性别表演，用以利用西方男性对东方女性的幻想和对自身男性气概的过度自信。而《文弱书生》为我们理解宋丽玲这种“阴柔”外表下的复杂男性气概提供了理论基础。宋丽玲的“阴柔”与“才子”的文弱有异曲同工之妙，它们都挑战了西方单一的男性气概标准。作者指出，中国传统文化中对“才子”的推崇说明了男性气概并非只有一种“阳刚”的模式，而宋丽玲的形象则进一步将这种“阴柔”的男性气概推向极致，并赋予其反殖民、反霸权的政治意义。宋丽玲利用西方对东方“阴柔”的刻板印象，成功地欺骗了高仁尼，最终使其男性自尊彻底崩溃。这表明，在某些文化语境下，看似“脆弱”或“阴柔”的男性特质，反而可能蕴含着强大的力量和颠覆性。&lt;/p&gt;

    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-61&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-62&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        另外，本书探讨了男性同盟与英雄义气的叙事机制，从《水浒传》《西游记》等英雄小说到史传叙事中“结拜-共谋”的模式，揭示男性之间的情感是如何被政治化和神圣化为忠义的。这种同盟与日本幕府时代的“众道”有共通之处，二者都是精英男性圈层内的亲密关系。书中探讨了中国传统文化中的“同性社交渴望”（homosocial desire），指出男性之间的深厚情谊以及一定程度的身体亲密，是与忠诚、信任和情感寄托相联系的。而日本的“众道”文化则将这种同性关系制度化、仪式化，并赋予其武士道精神的内涵，强调主公与“小姓”（大名身边的年轻侍童）之间超越生死的忠诚和情感纽带。两者都体现了非西方语境下男性气概的复杂性与多元性，展现了男性气质在不同文化中可以有截然不同的表现形式和价值评判。无论是“才子”的文采风流，还是“小姓”的忠诚侍奉，都说明了男性价值的实现途径并非只有武力征服或经济成功，还可以通过文化修养、情感联结和个人魅力来体现。当然，“才子”的“温润之身”是被制度制造出来的“驯服身体”，大名与“小姓”的亲密关系也不是任性之爱，而是被武家内部的人事编制与礼仪法度严格控制。两边都在把少年之身社会化、功用化：一边是会吟会写的“文身”，一边是能侍能战的“武身”。
    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-62&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-63&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        &lt;p&gt;“性别研究”长期存在被狭义化为“只研究女性”的倾向，这种局限不仅让男性处于“不可触碰的中心”，也在学理上遮蔽了性别权力在不同主体间的循环、流变与再生产。本书的另一大贡献就在于打破了这种窠臼。女性主义既提供了研究男性气质的语境，也提醒我们必须把“男人”重新放回其被规训、被叙述、被欲望形塑的“性别化位置”之中（而非无性别的“普遍人”）。正如书中引用的特尔玛·芬斯特（Thelma Fenster）的观点：“女性一直被看作是具体的、在地的存在，而男性则始终不可触及，享有那位极少现身且难以接近的‘天父’的特权。由此，女性主义可能无意中强化了那种把女性置于次等地位上的二元划分。”&lt;/p&gt;
&lt;p&gt;“女性主义与后殖民主义和马克思主义一脉相承的思维方式都是关注那些被压迫的、被边缘化的少数群体。因而从这个角度看，性别研究就是要去解放女性。这当然是没问题的。但是，这种性别话语也是一把双刃剑。”在中国史学与文学研究的场域里，把性别研究等同于“内闺-家私”的女性史，尤易造成盲点。作者援引曼素恩（Susan Mann）的观点指出，由于中华帝国晚期的强性别隔离，诸如官僚、科举、书院、会党、商贸等“公共”领域几乎都由男性与男性关系构成，若仍把性别研究限于“妇女/家务”，反而会失去对“男人如何在男-男关系中被组织与欲望”的基本追问。正是在这一意义上，本书以“才子”这一文学-文化装置为轴心，展示了文本、身体、情欲与权力如何共同生产出一种可见却脆弱的男性身形，从而把“男性也被性别化”的问题置于中国经验的细密纹理中加以辨析。这一视角使性别研究真正回到“关系的政治”，关注的不只是从女人到男人的对象转换，而是从“非问题的男性”转向“问题化的男性”。&lt;/p&gt;
&lt;p&gt;通过将男性研究“纳入”性别研究，《文弱书生》把以往被当作“无性别的默认人类”的男性，重新放回性别关系的互动场，让其可见、可分析、可比较、可对话、可协商。这与当下女性主义人群常用的“纳入式”话语可以构成一个有趣的对照。亲密行为中的“纳入/受纳”在经验上往往伴随主动/被动的非对称性，而学术上的“纳入”应当有鉴于此，不是把男性置于新的中心，更不是以“主动者”的名义再生产父权，而是让不同性别与取向的位置彼此可交换、可审视。因此，这一对照可以帮助我们理解“把男性放回性别”的必要性，同时也提醒我们：真正有效的“纳入”，不是把谁“插回中心”，而是重写版图——让多元主体在同一张地图上以非支配的方式定位和对话。&lt;/p&gt;

    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-63&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-64&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        &lt;p&gt;无法撇开西方理论，但又要强调在地化知识和体验，一直是区域文化研究的一大难点。诸如“意识形态”“主体性”“男性气质”等术语本身都带有启蒙-现代性的历史尾迹，将它们用于前现代中国须谨慎校准适用边界。这份方法论上的克制，使这本书中每一次与西方理论的“对话”都不是对后者的简单套用，而是“以彼观此、以此反观彼”的双向校正。作者并未照搬福柯、巴特勒等西方学者的理论，而是将其作为“阅读策略”用以解读中国材料，同时警惕概念的文化来源。他用阴/阳—文/武框架重新阐释性别与权力，把区域性材料的解释力推到了理论前沿，这一方法论上的自觉，避免了理论帝国主义，同时也为地方性知识的创新迈出了宝贵的探索步伐。&lt;/p&gt;
&lt;p&gt;同样难能可贵的是，作为一本二十年前在海外出版的书籍，其核心洞见对于理解当代中国与世界依然有力，以下试举几例：&lt;/p&gt;
&lt;p&gt;其一，性别气质是多元且分层的，当今世界同样存在“霸权”“从属”“边缘”的三分，只是“霸权阳刚”不再只有武力/刚猛一种面孔；它可能是国族叙事里的铁血话语、资本话语里的成功学、科技语境里的民族主义，等等。“秀肌肉”只是其中一种外观，以技术、管理、话语控制实现的“阳刚”同样能够占据霸权，例如科技工作者、高科技企业就常常被纳入技术民族主义的象征链：理性、沉稳、攻坚克难、公而忘私。这里的“霸权阳刚”不像肌肉那样可视，而是被父权制以知识—系统—效率的“技术气质”统摄，同时与民族主义想象结盟，以获得文化正当性。&lt;/p&gt;
&lt;p&gt;其二，“文/武”与“阴/阳”的相对位置并非来自性别，而是权力建构的产物，迁移到今天，就是话语权的位势切换，谁掌控叙事、谁能上热搜、谁能把形象变现，就能处于“阳位”；而在监管、平台或资方面前，再“强”的个体也会转入“阴位”。韩流偶像的“白净、纤细、少年感”，靠练习生体系、镜头语言、妆造与舞台程式被稳定复制，颜值与身材管理、舞台走位与镜头“抓点”等共同把“可欲、可控、可消费”的身体做成标准件。&lt;/p&gt;
&lt;p&gt;其三，“反叛与收编”的循环不仅出现在古代的才子佳人小说里，当下很多原本非主流的性别形象也会被商业与主流叙事吸纳、净化，变成可被销售的风格或“国风”的资源。当然，从微观视角来看，前现代的“礼—法—科举”与行会/宗族网络，是“文弱之身”的规训装置；而今天，对男性气质的规训常由平台规则、商业代言、舆论运动发动。装置变了，身体与美学的“驯化”方式也就不同。&lt;/p&gt;
&lt;p&gt;不过，尽管《文弱书生》用阴/阳位置解释性别实践与权力关系的努力值得肯定，然而这一概念高度抽象，在具体文本中可能存在过度阐释的可能。比如某些文学文本的身体呈现可能更多由文类规范，而非权力结构主导。此外，作者聚焦文学作品中的男性形象，但较少引入女性读者和作者的视角。才子佳人小说中，佳人的审美偏好与情感表达理应对才子形象的塑造起到重要作用；女性书写如何评价阴柔男性，也值得纳入分析。若能增加上述女性主体的参与，也可以避免男性研究再次将女性边缘化的风险。&lt;/p&gt;

    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-64&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-65&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        &lt;p&gt;笔者少年时曾以“谦谦君子，温润如玉”作为自己的人生信条，然而参加工作、走入社会之后，不得不接受权力与舆论的各种形象规训而不断进行痛苦的调适。正如本书开篇引用的弗吉尼亚·伍尔夫的话，“文学不是任何人私有的而是所有人共享的领地”，那么性别话语同样也应当如此。在权力与情感、文与武、阴与阳的天地间，我们需要的不是单一的“好女人”“好男人”模本，而是理解并尊重彼此差异的温润眼光。这本书如同一面镜子，映照出中国文化中多元的男性风景，也照见我们每一个人内心脆弱却坚韧的自我。&lt;/p&gt;
&lt;p&gt;在看见自我的同时，本书还给我们提供了看待他者时的批判视角。正如明清小说中情与礼的冲突常以“反讽—颠覆—收编”的三段式完成，才子佳人戏剧常以私情违背礼教起事端，终又因功名成就而归入秩序。歌咏私情的文本对正统阳刚构成微妙挑战，但最终通过功名而被正统收编。父权制的一个高明之处在于，它允许局部反叛以维持总体秩序。就像本文开头的脱口秀场景，当代性别舆论里许多“看似解放”的风格与口号，非常容易被市场或主流话语吸纳为可销售、可动员的“新品类”，形成“快反叛、快收编”的循环。对这种循环的警惕与识别，也是本书对当下性别议题提供的重要方法论启示。&lt;/p&gt;
&lt;p&gt;进一步说，既然男性气概不是自然物而是权力之建构，循着这一路径展开，当下所谓“厌女／厌男”的互相攻讦并非两性矛盾的真相，更非“天性”之争，而是父权制权力装置看似无意、实则有意的副产品。换言之，男人与女人是受到同一套身体政治摆布的，我们共同的敌人是那套让性别成为支配链条的权力本身。正如玛丽亚·米斯在《父权制与资本积累：国际劳动分工中的女性》一书中指出的，女性和男性并非受害者和恶棍的关系，对于父权制的建构与巩固而言，所有人都可能难辞其咎。如果将“两性对立”叙述成“被性别化的女性对无性别的男性开战”，也许是变相地为父权续命。父权制是一个强大的链条，每一本书、每一次发声、每一次行动都像是在努力松动链条上的某一个环节，直到它最终断裂。我们并不知道人类下一步将走向何方，但我们可以肯定的是，人类可以在打碎这些镣铐之后继续前进。&lt;/p&gt;

    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-65&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;
&lt;h3 id=&#34;佛罗伦萨安杰利科大展致敬文艺复兴先声&#34;&gt;佛罗伦萨安杰利科大展：致敬文艺复兴先声
&lt;/h3&gt;&lt;div class=&#34;note-card&#34;&gt;
    &lt;div class=&#34;nc-accent&#34;&gt;&lt;/div&gt;

    &lt;div class=&#34;nc-header&#34;&gt;
        &lt;div class=&#34;nc-meta&#34;&gt;
            &lt;span class=&#34;nc-badge&#34;&gt;READING&lt;/span&gt;
            &lt;span class=&#34;nc-date&#34;&gt;2025-10-09&lt;/span&gt;
        &lt;/div&gt; &lt;a href=&#34;https://m.thepaper.cn/detail/31620739&#34; target=&#34;_blank&#34; class=&#34;nc-title&#34; title=&#34;访问原文&#34;&gt;
            佛罗伦萨安杰利科大展：致敬文艺复兴先声
            &lt;svg class=&#34;nc-link-icon&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
        &lt;/a&gt;
    &lt;/div&gt;

    
    &lt;div class=&#34;nc-context&#34;&gt;
        &lt;div class=&#34;nc-quote-icon&#34;&gt;“&lt;/div&gt;
        &lt;div class=&#34;nc-summary-text&#34;&gt;佛罗伦萨正在举办一场重要的展览，展出安杰利科修士的作品。安杰利科是15世纪一位关键艺术家，连接了哥特式传统和文艺复兴时期的创新。这是70年来首次在佛罗伦萨举办的大型安杰利科作品展，横跨两个展区，展出120件作品。展览探索了他的艺术演变、对文艺复兴艺术的影响以及他深厚的灵性，其中在历史悠久的圣马可博物馆展出的作品尤为突出。&lt;/div&gt;
    &lt;/div&gt;
    

    
    
    
&lt;/div&gt;

&lt;style&gt;
     
    .note-card {
         
        --nc-bg-card: #ffffff;
        --nc-border: rgba(0,0,0,0.04);
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.08);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.12);
        
        --nc-title: #2c3e50;
        --nc-title-hover: #3a7bd5;
        --nc-meta: #999999;
        
        --nc-bg-context: #f8f9fa;
        --nc-border-context: #e2e8f0;
        --nc-quote-icon: #e2e8f0;
        --nc-text-summary: #555555;
        
        --nc-label-bg: #ffffff;
        --nc-label-text: #2d3748;
        --nc-content-text: #2d3748;
        --nc-link-icon: #cbd5e0;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.1);
        --nc-badge-text: #3a7bd5;

        position: relative;
        background: var(--nc-bg-card);
        border-radius: 12px;
        box-shadow: var(--nc-shadow);
        margin: 2.5rem 0;
        overflow: hidden;
        border: 1px solid var(--nc-border);
        font-family: inherit; 
        transition: transform 0.3s ease, box-shadow 0.3s ease, background 0.3s, border-color 0.3s;
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .note-card {
            --nc-bg-card: #1e1e1e;
            --nc-border: #333333;
            --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
            --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
            
            --nc-title: #f0f0f0;
            --nc-meta: #999999;
            
            --nc-bg-context: #252525;
            --nc-border-context: #444444;
            --nc-quote-icon: #333333;
            --nc-text-summary: #aaaaaa;
            
            --nc-label-bg: #1e1e1e;
            --nc-label-text: #cccccc;
            --nc-content-text: #dddddd;
            --nc-link-icon: #666666;
            
            --nc-badge-bg: rgba(58, 123, 213, 0.2);
        }
    }

    html[data-scheme=&#34;dark&#34;] .note-card {
        --nc-bg-card: #1e1e1e;
        --nc-border: #333333;
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
        
        --nc-title: #f0f0f0;
        --nc-meta: #999999;
        
        --nc-bg-context: #252525;
        --nc-border-context: #444444;
        --nc-quote-icon: #333333;
        --nc-text-summary: #aaaaaa;
        
        --nc-label-bg: #1e1e1e;
        --nc-label-text: #cccccc;
        --nc-content-text: #dddddd;
        --nc-link-icon: #666666;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.2);
    }

    .note-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--nc-shadow-hover);
    }

     
    .nc-accent {
        height: 4px;
        background: linear-gradient(90deg, #3a7bd5, #00d2ff); 
        width: 100%;
    }

     
    .nc-header {
        padding: 24px 28px 10px; 
    }

    .nc-meta {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 10px; 
        font-size: 13px; 
        color: var(--nc-meta);
        font-weight: 600;
        letter-spacing: 1px;
        text-transform: uppercase;
    }

    .nc-badge {
        color: var(--nc-badge-text);
        background: var(--nc-badge-bg);
        padding: 2px 6px;
        border-radius: 4px;
    }

    .nc-title {
        display: block;
        font-size: 2rem; 
        font-weight: 700;
        color: var(--nc-title);
        text-decoration: none;
        line-height: 1.3;
        transition: color 0.2s;
    }

    .nc-title:hover {
        color: var(--nc-title-hover);
    }

    .nc-link-icon {
        width: 20px; 
        height: 20px;
        color: var(--nc-link-icon);
        margin-left: 5px;
        vertical-align: middle;
        transition: color 0.2s;
    }

    .nc-title:hover .nc-link-icon {
        color: var(--nc-title-hover);
    }

     
    .nc-context {
        margin: 12px 28px 24px;
        background: var(--nc-bg-context);
        padding: 20px 24px;
        border-radius: 8px;
        position: relative;
        border-left: 4px solid var(--nc-border-context);
        transition: background 0.3s, border-color 0.3s;
    }

    .nc-quote-icon {
        position: absolute;
        top: 8px;
        left: 10px;
        font-family: serif; 
        font-size: 40px;
        line-height: 1;
        color: var(--nc-quote-icon);
        pointer-events: none;
        transition: color 0.3s;
    }

    .nc-summary-text {
        font-size: 1.7rem; 
        color: var(--nc-text-summary);
        line-height: 1.6;
        font-style: italic;
        position: relative;
        z-index: 1;
        padding-left: 15px; 
        transition: color 0.3s;
    }

     
    .nc-body {
        padding: 0 28px 32px;
        position: relative;
    }

     
    .nc-label {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        font-size: 13px; 
        font-weight: 700;
        color: var(--nc-label-text);
        background: var(--nc-label-bg);
        padding-right: 10px;
        margin-bottom: 12px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
        transition: color 0.3s, background 0.3s;
    }

    .nc-content {
        color: var(--nc-content-text);
        font-size: 1.6rem; 
        line-height: 1.75;
        transition: color 0.3s;
    }

     
    .nc-content p { margin-bottom: 1em; }
    .nc-content p:last-child { margin-bottom: 0; }
    
    .nc-content ul { padding-left: 20px; color: inherit; }
    .nc-content li { margin-bottom: 6px; }
&lt;/style&gt;
&lt;p&gt;弗拉·安杰利科（原名圭多·迪·皮耶罗Guido di Piero，亦称菲耶索莱的乔瓦尼修士Fra Giovanni da Fiesole；约1395年生于穆杰洛的维基奥，1455年卒于罗马）以独特的艺术风格著称——既承续晚期哥特的传统，又融汇初兴的文艺复兴理念。他的作品因对透视与光线的巧妙运用而闻名，开创了人物与空间关系的全新范式，其创作核心是对神与人关系的思考。&lt;/p&gt;
&lt;h3 id=&#34;武田田评心智现代性与疯癫社会学家的物种起源&#34;&gt;武田田评《心智、现代性与疯癫》｜社会学家的《物种起源》
&lt;/h3&gt;&lt;div class=&#34;note-card&#34;&gt;
    &lt;div class=&#34;nc-accent&#34;&gt;&lt;/div&gt;

    &lt;div class=&#34;nc-header&#34;&gt;
        &lt;div class=&#34;nc-meta&#34;&gt;
            &lt;span class=&#34;nc-badge&#34;&gt;READING&lt;/span&gt;
            &lt;span class=&#34;nc-date&#34;&gt;2025-10-09&lt;/span&gt;
        &lt;/div&gt; &lt;a href=&#34;https://www.thepaper.cn/newsDetail_forward_31610711?commTag=true&#34; target=&#34;_blank&#34; class=&#34;nc-title&#34; title=&#34;访问原文&#34;&gt;
            武田田评《心智、现代性与疯癫》｜社会学家的《物种起源》
            &lt;svg class=&#34;nc-link-icon&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
        &lt;/a&gt;
    &lt;/div&gt;

    
    &lt;div class=&#34;nc-context&#34;&gt;
        &lt;div class=&#34;nc-quote-icon&#34;&gt;“&lt;/div&gt;
        &lt;div class=&#34;nc-summary-text&#34;&gt;利亚·格林菲尔德（Liah Greenfeld）的《心灵、现代性、疯狂》（Mind，Modernity，Madness）一书认为，像精神分裂症和双相情感障碍这样的现代精神疾病是现代文化的产品，而现代文化又是由民族主义塑造的。这本书被誉为社会学领域的“物种起源”，它提出，民族主义固有的对平等和个人自决的强调会导致身份危机，进而导致精神崩溃。本书追溯了这些疾病在不同国家兴起的历程，将其与民族主义意识形态的传播及其对集体和个人意识的影响联系起来。&lt;/div&gt;
    &lt;/div&gt;
    

    
    
    
&lt;/div&gt;

&lt;style&gt;
     
    .note-card {
         
        --nc-bg-card: #ffffff;
        --nc-border: rgba(0,0,0,0.04);
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.08);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.12);
        
        --nc-title: #2c3e50;
        --nc-title-hover: #3a7bd5;
        --nc-meta: #999999;
        
        --nc-bg-context: #f8f9fa;
        --nc-border-context: #e2e8f0;
        --nc-quote-icon: #e2e8f0;
        --nc-text-summary: #555555;
        
        --nc-label-bg: #ffffff;
        --nc-label-text: #2d3748;
        --nc-content-text: #2d3748;
        --nc-link-icon: #cbd5e0;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.1);
        --nc-badge-text: #3a7bd5;

        position: relative;
        background: var(--nc-bg-card);
        border-radius: 12px;
        box-shadow: var(--nc-shadow);
        margin: 2.5rem 0;
        overflow: hidden;
        border: 1px solid var(--nc-border);
        font-family: inherit; 
        transition: transform 0.3s ease, box-shadow 0.3s ease, background 0.3s, border-color 0.3s;
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .note-card {
            --nc-bg-card: #1e1e1e;
            --nc-border: #333333;
            --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
            --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
            
            --nc-title: #f0f0f0;
            --nc-meta: #999999;
            
            --nc-bg-context: #252525;
            --nc-border-context: #444444;
            --nc-quote-icon: #333333;
            --nc-text-summary: #aaaaaa;
            
            --nc-label-bg: #1e1e1e;
            --nc-label-text: #cccccc;
            --nc-content-text: #dddddd;
            --nc-link-icon: #666666;
            
            --nc-badge-bg: rgba(58, 123, 213, 0.2);
        }
    }

    html[data-scheme=&#34;dark&#34;] .note-card {
        --nc-bg-card: #1e1e1e;
        --nc-border: #333333;
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
        
        --nc-title: #f0f0f0;
        --nc-meta: #999999;
        
        --nc-bg-context: #252525;
        --nc-border-context: #444444;
        --nc-quote-icon: #333333;
        --nc-text-summary: #aaaaaa;
        
        --nc-label-bg: #1e1e1e;
        --nc-label-text: #cccccc;
        --nc-content-text: #dddddd;
        --nc-link-icon: #666666;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.2);
    }

    .note-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--nc-shadow-hover);
    }

     
    .nc-accent {
        height: 4px;
        background: linear-gradient(90deg, #3a7bd5, #00d2ff); 
        width: 100%;
    }

     
    .nc-header {
        padding: 24px 28px 10px; 
    }

    .nc-meta {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 10px; 
        font-size: 13px; 
        color: var(--nc-meta);
        font-weight: 600;
        letter-spacing: 1px;
        text-transform: uppercase;
    }

    .nc-badge {
        color: var(--nc-badge-text);
        background: var(--nc-badge-bg);
        padding: 2px 6px;
        border-radius: 4px;
    }

    .nc-title {
        display: block;
        font-size: 2rem; 
        font-weight: 700;
        color: var(--nc-title);
        text-decoration: none;
        line-height: 1.3;
        transition: color 0.2s;
    }

    .nc-title:hover {
        color: var(--nc-title-hover);
    }

    .nc-link-icon {
        width: 20px; 
        height: 20px;
        color: var(--nc-link-icon);
        margin-left: 5px;
        vertical-align: middle;
        transition: color 0.2s;
    }

    .nc-title:hover .nc-link-icon {
        color: var(--nc-title-hover);
    }

     
    .nc-context {
        margin: 12px 28px 24px;
        background: var(--nc-bg-context);
        padding: 20px 24px;
        border-radius: 8px;
        position: relative;
        border-left: 4px solid var(--nc-border-context);
        transition: background 0.3s, border-color 0.3s;
    }

    .nc-quote-icon {
        position: absolute;
        top: 8px;
        left: 10px;
        font-family: serif; 
        font-size: 40px;
        line-height: 1;
        color: var(--nc-quote-icon);
        pointer-events: none;
        transition: color 0.3s;
    }

    .nc-summary-text {
        font-size: 1.7rem; 
        color: var(--nc-text-summary);
        line-height: 1.6;
        font-style: italic;
        position: relative;
        z-index: 1;
        padding-left: 15px; 
        transition: color 0.3s;
    }

     
    .nc-body {
        padding: 0 28px 32px;
        position: relative;
    }

     
    .nc-label {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        font-size: 13px; 
        font-weight: 700;
        color: var(--nc-label-text);
        background: var(--nc-label-bg);
        padding-right: 10px;
        margin-bottom: 12px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
        transition: color 0.3s, background 0.3s;
    }

    .nc-content {
        color: var(--nc-content-text);
        font-size: 1.6rem; 
        line-height: 1.75;
        transition: color 0.3s;
    }

     
    .nc-content p { margin-bottom: 1em; }
    .nc-content p:last-child { margin-bottom: 0; }
    
    .nc-content ul { padding-left: 20px; color: inherit; }
    .nc-content li { margin-bottom: 6px; }
&lt;/style&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-68&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        &lt;p&gt;2016年，哈佛大学出版社出版了格林菲尔德“民族主义三部曲”的终结篇《心智、现代性与疯癫：文化对人类经验的影响》（Mind，Modernity，Madness: The Impact of Culture on Human Experience）。九年后的2025年1月，这部著作的中文版终于面世。从标题来看，这本书似乎与民族主义没什么关系，但实际上它仍然是格氏毕生致力于的民族主义研究的一部分。三部曲的前两部分别是《民族主义：走向现代的五条道路》和《资本主义精神：民族主义与经济增长》。作为涂尔干和韦伯的忠实门徒，格氏坚信集体意识对现代社会的塑造作用，而民族国家意识/民族主义则是“现代文化的根基和框架”（《心智、现代性与疯癫》，第6页）。《民族主义：走向现代的五条道路》开宗明义，阐述了民族主义为何出现、如何出现及转型，以及不同形式的民族认同和民族意识怎么转变为制度性的习惯与文化模式。《资本主义精神：民族主义与经济增长》接着聚焦在资本主义经济模式上纵深论述，分析现代经济有别于以往所有经济形态的根本原因，认为其持续性的发展取向和意识正是民族主义的产物。两本书对涂尔干和韦伯的回应清晰可辨。&lt;/p&gt;
&lt;p&gt;第二部出版十三年后，第三部方才问世。在漫长的十三年里，格氏对民族主义的思考更加深入幽微，穿透宏观的经济、政治、道德和习俗，潜入“个人生存体验中最为隐私的角落” （第6页）。《心智》一书的核心论断如下：精神分裂症、躁郁症和重度单向抑郁症这三大“精神癌症”是现代文化的产物，由于现代性本身就是由民族主义造成的，故而这三项精神疾病也是民族主义在全球发展的结果。&lt;/p&gt;

    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-68&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-69&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        &lt;p&gt;谈到“层展”，就不得不提美国著名的凝聚态理论物理学家菲利普·安德森（Philip W. Anderson），正是安德森在1972年发表于《科学》杂志的论文里提出了层展这个概念。安德森认为，尽管现代物理学致力于不断打碎物质、研究其更加深层细分的结构，但是即使我们已经将万事万物还原为了基本单元和基本规律，并不意味着我们可以从这些“基本”（fundamentals）出发构建复杂的物质世界。从原子到分子，从分子到生物乃至人类社会，向上跨越不同物理层级，新现象不是旧现象的简单排列组合，而是自然而然地emerge出来的（国内也有把emerge翻译为“演生”或“涌现”的，但似乎都未能表达出原词那种生机勃勃、出人意料的自发特征）。 “每个层次的规律不能等同于下一层次规律的应用。高层次规律向低层次规律的还原是原则上的，新的规律出现于从低层次向高层次的层展中。”（施郁：《层展论的旗手——菲利普·安德森》，《自然杂志》第43卷第1期，2020年，78页）&lt;/p&gt;
&lt;p&gt;格氏借层展概念应用于社会学，其实是把物理学、生物学和人文社会科学想要研究的对象视作一体，这个对象就是人类世界的现实。物理学负责现实的物质层级，物质层展到有机层级由生物学负责，有机层级再向上层展就进入文化层级，而文化依托于人的心智（mind），这一层级进入象征现实。低层级的规律无法适用于高层级，但高层级规律的应用必须依赖低层级的支持。以心智为例，它是象征性的、由文化决定的，但是它必须在大脑这个生物实体中运作，文化没办法决定大脑的构造。高层级须以低层级的结构作为边界条件（boundary conditions）。&lt;/p&gt;

    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-69&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-70&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        格氏对以美国为主的当代西方人文社会科学吐槽甚多，火力集中在论文《二十世纪初以来的社会科学》（Social Science from the Turn of the 20th Century）中。她直言不讳地指出，将“社会科学”分解成社会学、经济学、历史学等等独立学科的做法“并不是出于科学的需要，而是因为社会科学家和研究型大学的管理者希望为自己和自己的同事创造更多的就业机会。因此，整件事情本末倒置了”。这导致社会学科的关注点跟随外部利益的变化而随时转移，“通过创造表达这些利益的语言，以及通过在这些利益背后放置科学权威，将它们呈现为客观而‘真实’的，从而大大强化这些外部利益”。格氏还认为“社会学”（sociology）这个名称根本就起错了，所有的动物物种都有社会，社会学应该归在生物学的范畴里。而研究人类特殊性的学问必定要与文化和心智有关，并以历史为其主要证据。
    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-70&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-71&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        &lt;p&gt;《心智》试图勾勒出人文社会科学的崭新研究范式，并为之提供范例。“如果我们能够把精神疾病解释为受开放的现代文化影响的心智或意识的一个功能表现，我们便可以大概像研究地球引力或物种演变那样，开始科学地研究有关心智的非物质性的现实。”（32页）&lt;/p&gt;
&lt;p&gt;《心智》遂将历史作为其主要研究路径和证据。在“心理学”这一部分，格氏从病原学和流行病学的角度梳理了精神分裂症研究的前沿科学证据，主要目的是证明这两个领域的前沿研究并没有解释清楚该疾病的病因，不少结论含糊其辞，甚至互相矛盾。她援引涂尔干的观点，认为“在解释的整个进程中，下定义或详尽描绘是第一步”，而不能准确界定精神分裂症的本质并为其下一个恰当的定义正是这一“研究领域的阿喀琉斯之踵”（160页）。在接下来的梳理中，格氏主要以路易·萨斯的理论专著《疯癫与现代性：现代艺术、文学和思想领域的理智丧失》（Madness and Modernism: Insanity in the Light of Modern Art，Literature，and Thought）和西尔维娅·娜莎的传记作品《美丽心灵：诺贝尔获奖者数学天才约翰·纳什的一生》（A Beautiful Mind: The Life of Mathematical Genius and Nobel Laureate John Nash）为分析对象，试图从理论和实例两个方面证明“以民族主义原则为基础的现代社会极易导致人类心理失范，进而使得个人身份意识（‘关系的自我’）变得问题重重。不健全的个人身份意识势必继而导致意志受损”（199页）。&lt;/p&gt;
&lt;p&gt;在梳理躁狂抑郁症的前人研究时，格氏则干脆从头到尾点评了古德温和贾米森的权威专著《躁狂抑郁症》（Manic Depressive Illness），结论是这本建立在神经生物学最新研究成果基础上的专著对认识和解决躁狂抑郁症毫无用处。只是从生物学角度讨论精神疾病，就好像无论在哪儿丢了东西，都要到明亮的街灯下去寻一样，可谓缘木求鱼。这部分的实例则选自贾米森本人的自传《躁动不安的灵魂》（An Unquiet Mind），并不无遗憾地指出：贾米森虽然在写自传的过程中达成了某种自我疗治，但是由于方法总在生物学事实上打转，她永远无法根治这个可怕的痼疾。&lt;/p&gt;
&lt;p&gt;格氏特别摘引了《躁狂抑郁症》结论部分充满信心的展望，评论说：“一篇关于躁郁症的科研文本，却大量使用将来时态和虚拟语气，这一做法或多或少让这类文体本应具有的严肃性打了折扣，也可以说让这个本来非常严肃的话题失去了其沉重的分量。”（278页）这句评语很有意思，不仅起到了将论述的方向从现有生物学现实转到文化诱因的作用，而且特别凸显了语言文字表达的重要性。如果说达尔文最热衷于观察的样本是化石碎片，格氏最热衷于观察的样本则是最能够反映人类象征性现实的载体——语言。&lt;/p&gt;
&lt;p&gt;在接下来篇幅最长的“历史”部分，《心智》回溯了精神疾病从英国开始、经由欧洲大陆蔓延到美国并登峰造极的历史过程，引用、转述和阐释了大量历史、文学、哲学、医学文本；通过观察这些样本，尤其是样本中语言的演变，来判断精神疾病的演化进程。&lt;/p&gt;
&lt;p&gt;格氏认为，在某个词被创造出来之前，这个词所代表的文化现象是不存在的。只有当社会出现了某种文化现象、人的心智试图理解它的时候，才会诞生新词；而新词反过来又塑造强化了心智的认知，进而影响社会现象。例如：抱负（aspiration）、成就（achievement）和成功（success）从十六世纪的英格兰开始获得现代释义，原先的贬义或中立词义消失，积极词义保留。这准确反映了民族主义在英国的滥觞，“人民主权”使得“人”的概念得到重新诠释，“人成为一种机体、一种自治而自尊的状态、一个有责任且有能力为自己命运负责的个体”（351页）。民族主义兴起的现象催生了新词诞生，新词在使用过程中被人们不断诠释理解，人们的理解引发新的现象。&lt;/p&gt;

    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-71&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-72&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        由于文学是语言这一载体最丰富和活跃的表现，也是构建历史和哲学的基础，许多实例都摘自文学作品。在格氏看来，莎士比亚生逢其时——语言天才恰逢社会重大变革期，理所当然地为现代英语创造了大量新词。她甚至认为，现代词义上的“爱”就是由莎士比亚在《罗密欧与朱丽叶》中定义的，即理想的浪漫之爱（romantic love）；其鲜明特色在于“直接导致人认识自我”（364页）。阳台情话发生后的第二天，茂丘西奥对罗密欧说：“Now art thou Romeo，now art thou what thou art，by art as well as by nature.”（现在你是罗密欧了，你是你真正的样子，既由天性造就又有后天努力。）人需要在自然赋予的身份之上自己找寻一个新的身份，这是民族主义兴起以后才有的意识。有趣的是，朱生豪的译本中，这句话被翻译成“现在你合群了，无论秉性还是修养都是真正的罗密欧了”（朱生豪：《莎士比亚全集》第五卷，时代文艺出版社，2012年，128页）。“合群”的意思原文中并没有，甚至与原文意思相矛盾，显然是朱生豪自己的理解。这或许印证了格氏的观点——毕竟朱生豪生活的年代，中国的现代民族主义思潮还未大规模兴起；社会现象并未发生，语言上就无法变革，译者的心智还未经历语言的塑造，也就不能理解这句话的意思了。
    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-72&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-73&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        《心智》的历史部分重点论及的国家有：英国、法国、德国、俄罗斯和美国，排布的顺序恰好是历史上民族主义扩张的先后顺序，而这几个国家民族主义的发展情况应当是格氏最为熟稔的内容了。《民族主义：走向现代的五条道路》讨论民族主义在上述国家之间的依次传播；《资本主义精神：民族主义与经济增长》讨论传播中的经济情况，也就是民族主义如何影响人的群体决策和行为；而《心智》则以历史和经济变化的事实为证据，讨论传播中人的精神在宏观（文化）和微观（心智）层面上的变化。作为系列专著，“民族主义三部曲”整体构成了以历史为路径、关注象征性现实的实证研究范式。
    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-73&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-74&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        &lt;p&gt;将民族主义与精神疾病紧密联系在一起，首先需要清晰地界定民族主义和现代文化，为接下来的阐述设置基本前提。以下定义是格氏数十年民族主义研究的基石，也是她使用最为圆熟的理论工具：（1）文化是人类生活的首要经验现实；（2）现代文化由民族国家意识塑造，而文化又塑造了心智；（3）民族主义包含世俗化、生而平等和人民主权三部分，这些都让人得以掌握自己的命运，同时意味着人无法拥有明确的身份认同。换言之，人类与文化共同生长、相互塑造；民族主义兴起以后，世俗的经验世界取代超自然的上帝成为文化关注的焦点，西方文化因此转变为现代文化；由于现代文化由民族主义塑造，必然包含认为社会所有成员皆平等的观点，在此文化中的人们便难以形成个体身份认同。&lt;/p&gt;
&lt;p&gt;在此前提下，格氏再次援引涂尔干来提出推论：所谓社会失范（anomie）乃是文化无力向人们提供指引。“一个社会越早将自身定义为民族，心智错乱就越早在这个社会出现。而且，对于平等和自由的理想越执着，在社会、政治和经济制度中越好地落实民族主义的两大原则（平等主义和人民主权），精神疾病就会越普遍。”（34页）也就是说，现代精神疾病的成因是民族意识塑造的现代文化导致了集体心智故障。&lt;/p&gt;

    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-74&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-75&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        &lt;p&gt;与此同时，民族主义的优点显而易见。正如《资本主义精神：民族主义与经济增长》中所言，民族主义诞生后，把经济发展当成是确保民族成员尊严和国家威望的主要手段，因而不断发展经济。英国之所以成为世界上第一个现代经济体，正因它是世界上第一个民族国家，英国在都铎王朝的迅速崛起建立在该王朝肇始的民族主义根基上。受到英国崛起的影响，欧洲各国依照与英国地理距离的远近依次接受民族主义思想，在经济发展、国力增强的同时依次出现社会失范现象；每一个民族对精神疾病从初识到不得不接受的过程都深深地打着民族主义的烙印。&lt;/p&gt;
&lt;p&gt;十七世纪下半叶，爱尔兰人把疯癫叫做“英国坏脾气”（English Spleen），然而在爱尔兰民族意识快速发展的刺激下，到了十八世纪中叶，它已经成为了“爱尔兰病”（Irish malady）。海峡对岸的法国人一开始将英国人的疯癫归咎于岛国变幻无常的天气，但经过了启蒙运动以后，法国的高级知识分子阶层同样产生了“倦怠”（ennui）。夏布多里昂将这一状态描绘为“隐秘的焦虑和令人窒息的激情的活力交织在一起”，并认为该现象的产生受到了卢梭《一个孤独散步者的遐想》的启发（464页）。 十九世纪初，法语里已有专门的词“精神异化”（alienation mentale）来形容遍及社会各个阶层的精神疾病，这一社会氛围显然深刻地影响到了1843年从德国来巴黎工作的年轻知识分子卡尔·马克思。格氏将马克思描绘为一个在多重民族、文化和种族身份中饱受精神折磨的天才，认为真正促使马克思着手分析资本主义经济体系的并不是现代社会的经济形式，而是现代社会的精神疾病——“《1844年哲学经济学手稿》中的异化概念与我们今天所说的精神分裂症症状（以及谱系障碍）惊人地相似”（498页）。&lt;/p&gt;
&lt;p&gt;十八、十九世纪德国政治上的分崩离析和经济上的落后迟缓是其精英阶层快速萌发民族主义思想的重要背景，但也导致知识分子对精神疾病的研究仅限于狭小的学术圈子，带有强烈的哲学和浪漫主义色彩。大量的受教育者在社会地位上虽然略高于普通民众，但经济上仍处于社会底层，这些“失范的最大受害者”随即掀起了“狂飙突进运动”；“六名主要的狂飙运动成员中，有四名在今天会被认为是精神病患者”（525页）。歌德的《少年维特之烦恼》在德国乃至欧洲风行，正因为小说为读者“无法逃脱的痛苦找到了一个可以接受的解释”，即通过自杀“结束无法忍受的存在，并一举实现了自我”（531页）。
俄国的民族主义由彼得大帝和亚历山大二世的两次改革带来，因此是自上而下推进的，花了很长时间才深入到市民阶层。最先受到民族主义影响的是知识分子，最先精神崩溃的自然也是他们，十八世纪九十年代产生了一波俄国知识分子的自杀潮，不过因为人数较少很快过去。二十世纪初，农奴解放四十多年后，数百万人涌入城市，接受教育，成为中产。他们的身份模棱两可，被称为“混合阶层”（raznochintsy），成为罹患精神疾病的重灾区；而他们当中“绝大多数人成为了革命者，只有少数人真正发疯或因此自杀”（551页）。&lt;/p&gt;

    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-75&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-76&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        &lt;p&gt;早在美国成为国家之前，疯癫就伴随新移民来到了这片土地。欧洲国家接受民族主义思想的时间和事件清晰可辨，故而可以梳理上述每个国家受到精神疾病侵害的轨迹。然而，对于美国这个生而具有民族意识的国家，格氏认为研究的核心问题不应再是“疯癫何时到来”，而是“随着自由和繁荣程度的增长，以及众多过去失权群体地位上升、选择增多，精神错乱的患病率有没有上升”——答案是肯定的。在引述了大量的相关数据分析和研究结论后，格氏点评道：“文明的进步是罪魁祸首。美国文明正在以惊人的速度前进；这个年轻的国家准备超越其旧世界的所有对手。技术革新也必然导致人们命运的频繁逆转……突如其来的繁荣和逆境都会让人疯狂。”（631页）在美国高速发展两百多年后，格氏不无惋惜地指出，“那些患有轻度的、普遍的、全美国都有的精神疾病的人，即神经衰弱患者，代表了整体上的美国文化”（660页）。&lt;/p&gt;
&lt;p&gt;《心智》的历史部分旁征博引、洋洋洒洒，显示出作者强大的语言功底（格氏精通英语、法语、俄语、德语、希伯来语）以及文献检索、阅读和分析的能力。读者循着历史路径徜徉于由象征性现实的海量样本搭建起的样本库，最终走向令人惊异的结论：启蒙运动与民族主义共生，共产主义理想和浪漫主义运动拜民族主义所赐，俄国革命因民族主义而起，而美国文化本身就是民族主义的。民族主义在为这些国家带来发展和富足的同时，也让人民染上了无法摆脱的精神疾病。&lt;/p&gt;
&lt;p&gt;相似的惊异情绪也曾为十九世纪末阅读《物种起源》的读者所感知，令他们大为震撼、难以接受。在之后一个多世纪中，遗传学、博物学、古生物学、分类学等领域的科学家反复试验、不断研究，将达尔文的自然选择、孟德尔遗传学、群体遗传学、生态学、古生物学证据等整合为一个强大的统一理论框架“现代综合进化论”，进化论才终于成为科学共同体的共识。直到今天，仍有相当数量的公众拒不承认进化论。&lt;/p&gt;

    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-76&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-77&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        尽管《美国精神病学》杂志的主编热忱地向“生物精神病学家、医生、未来学家、立法者、社区领袖、家长和所有学者”推荐本书，但《心智》在亚马逊网站上的销售相当惨淡。有读者打了两星评价后愤而留言：“书中关于大部分精神疾病源于现代性的论述非常吸引人，但引文实在是太多了，淹没了论述！”这也许是《心智》想要成为二十一世纪的《物种起源》之雄心的另一个障碍——初版《物种起源》十六万字，而英文版《心智》有二十六万词，中译本为五十八万字，在“太长不看”的互联网时代无疑是一座难以攀登的阅读高峰。被信息快速更迭的互联网文化改变了心智的读者，还有兴趣和能力去理解纸质时代探幽寻微的心智所创造的关于人类心智的作品吗？
    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-77&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-78&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        《中国精神障碍疾病负担和卫生服务利用的研究》（简称“中国精神卫生调查”，China Mental Health Survey，CMHS）于2013至2015年在全国范围内进行的调查显示，我国精神障碍终生患病率约为百分之十六点六，“中国成人中受到精神障碍困扰的比较高，从而造成较大的疾病负担”（黄悦勤：《中国精神障碍流行病学研究概述》，《广西医科大学学报》2024 Nov. 41[11]，1496-1500页）。美国国家精神卫生研究所（NIMH）的数据则显示，2022年有五千九百万美国成年人（即美国成年人口的百分之二十三点一）罹患精神疾病。虽然与美国相比，我国精神疾病的发病率还不算太高，但是考虑到人口基数，已然成为不可忽视的重大问题。依照《心智》给予我们的启示，精神疾病在中国的快速增长，是否可以归因于民族主义的扩展和深化？中华文明绵延至今，改天换地的现代化进程也并没有改变其文明的根本特质，即以欣然容纳矛盾的“大一统”原则为首要原则。在中国向西方学习的“现代化套餐”里，西方意识形态和文化传统向来是中国最不情愿接受的附加选项，现代中国能否凭借深厚的文明特质剥离它们的影响？如果民族向心力同时建立在科技进步、国力增强和对传统文化的信心上，造成现代科学进步和经济发展的内在心智却源于西方文明的一神论逻辑，那么中国是否能够既高扬传统，又保持科学进步？如果接受现代文化影响心智的观点，那么在伴随着民族主义蔓延全球的疯癫浪潮中，中华文明能否成为一个例外？
    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-78&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;
&lt;h3 id=&#34;邱源媛评明代女真史八旗共同体的形成&#34;&gt;邱源媛评《明代女真史》｜八旗共同体的形成
&lt;/h3&gt;&lt;div class=&#34;note-card&#34;&gt;
    &lt;div class=&#34;nc-accent&#34;&gt;&lt;/div&gt;

    &lt;div class=&#34;nc-header&#34;&gt;
        &lt;div class=&#34;nc-meta&#34;&gt;
            &lt;span class=&#34;nc-badge&#34;&gt;READING&lt;/span&gt;
            &lt;span class=&#34;nc-date&#34;&gt;2025-10-09&lt;/span&gt;
        &lt;/div&gt; &lt;a href=&#34;https://www.thepaper.cn/newsDetail_forward_31713184&#34; target=&#34;_blank&#34; class=&#34;nc-title&#34; title=&#34;访问原文&#34;&gt;
            邱源媛评《明代女真史》｜八旗共同体的形成
            &lt;svg class=&#34;nc-link-icon&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
        &lt;/a&gt;
    &lt;/div&gt;

    
    &lt;div class=&#34;nc-context&#34;&gt;
        &lt;div class=&#34;nc-quote-icon&#34;&gt;“&lt;/div&gt;
        &lt;div class=&#34;nc-summary-text&#34;&gt;本书全面记述了明朝时期女真族的兴衰历史，填补了学术研究的空白。它考察了女真族的起源、与周边政权（明朝、朝鲜、蒙古）的互动、内部统一以及八旗制度的形成。该书运用满文和朝鲜文史料，为理解女真族身份认同、首领称号以及八旗的多民族构成提供了新的视角，有助于理解清朝的崛起。&lt;/div&gt;
    &lt;/div&gt;
    

    
    
    
&lt;/div&gt;

&lt;style&gt;
     
    .note-card {
         
        --nc-bg-card: #ffffff;
        --nc-border: rgba(0,0,0,0.04);
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.08);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.12);
        
        --nc-title: #2c3e50;
        --nc-title-hover: #3a7bd5;
        --nc-meta: #999999;
        
        --nc-bg-context: #f8f9fa;
        --nc-border-context: #e2e8f0;
        --nc-quote-icon: #e2e8f0;
        --nc-text-summary: #555555;
        
        --nc-label-bg: #ffffff;
        --nc-label-text: #2d3748;
        --nc-content-text: #2d3748;
        --nc-link-icon: #cbd5e0;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.1);
        --nc-badge-text: #3a7bd5;

        position: relative;
        background: var(--nc-bg-card);
        border-radius: 12px;
        box-shadow: var(--nc-shadow);
        margin: 2.5rem 0;
        overflow: hidden;
        border: 1px solid var(--nc-border);
        font-family: inherit; 
        transition: transform 0.3s ease, box-shadow 0.3s ease, background 0.3s, border-color 0.3s;
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .note-card {
            --nc-bg-card: #1e1e1e;
            --nc-border: #333333;
            --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
            --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
            
            --nc-title: #f0f0f0;
            --nc-meta: #999999;
            
            --nc-bg-context: #252525;
            --nc-border-context: #444444;
            --nc-quote-icon: #333333;
            --nc-text-summary: #aaaaaa;
            
            --nc-label-bg: #1e1e1e;
            --nc-label-text: #cccccc;
            --nc-content-text: #dddddd;
            --nc-link-icon: #666666;
            
            --nc-badge-bg: rgba(58, 123, 213, 0.2);
        }
    }

    html[data-scheme=&#34;dark&#34;] .note-card {
        --nc-bg-card: #1e1e1e;
        --nc-border: #333333;
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
        
        --nc-title: #f0f0f0;
        --nc-meta: #999999;
        
        --nc-bg-context: #252525;
        --nc-border-context: #444444;
        --nc-quote-icon: #333333;
        --nc-text-summary: #aaaaaa;
        
        --nc-label-bg: #1e1e1e;
        --nc-label-text: #cccccc;
        --nc-content-text: #dddddd;
        --nc-link-icon: #666666;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.2);
    }

    .note-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--nc-shadow-hover);
    }

     
    .nc-accent {
        height: 4px;
        background: linear-gradient(90deg, #3a7bd5, #00d2ff); 
        width: 100%;
    }

     
    .nc-header {
        padding: 24px 28px 10px; 
    }

    .nc-meta {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 10px; 
        font-size: 13px; 
        color: var(--nc-meta);
        font-weight: 600;
        letter-spacing: 1px;
        text-transform: uppercase;
    }

    .nc-badge {
        color: var(--nc-badge-text);
        background: var(--nc-badge-bg);
        padding: 2px 6px;
        border-radius: 4px;
    }

    .nc-title {
        display: block;
        font-size: 2rem; 
        font-weight: 700;
        color: var(--nc-title);
        text-decoration: none;
        line-height: 1.3;
        transition: color 0.2s;
    }

    .nc-title:hover {
        color: var(--nc-title-hover);
    }

    .nc-link-icon {
        width: 20px; 
        height: 20px;
        color: var(--nc-link-icon);
        margin-left: 5px;
        vertical-align: middle;
        transition: color 0.2s;
    }

    .nc-title:hover .nc-link-icon {
        color: var(--nc-title-hover);
    }

     
    .nc-context {
        margin: 12px 28px 24px;
        background: var(--nc-bg-context);
        padding: 20px 24px;
        border-radius: 8px;
        position: relative;
        border-left: 4px solid var(--nc-border-context);
        transition: background 0.3s, border-color 0.3s;
    }

    .nc-quote-icon {
        position: absolute;
        top: 8px;
        left: 10px;
        font-family: serif; 
        font-size: 40px;
        line-height: 1;
        color: var(--nc-quote-icon);
        pointer-events: none;
        transition: color 0.3s;
    }

    .nc-summary-text {
        font-size: 1.7rem; 
        color: var(--nc-text-summary);
        line-height: 1.6;
        font-style: italic;
        position: relative;
        z-index: 1;
        padding-left: 15px; 
        transition: color 0.3s;
    }

     
    .nc-body {
        padding: 0 28px 32px;
        position: relative;
    }

     
    .nc-label {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        font-size: 13px; 
        font-weight: 700;
        color: var(--nc-label-text);
        background: var(--nc-label-bg);
        padding-right: 10px;
        margin-bottom: 12px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
        transition: color 0.3s, background 0.3s;
    }

    .nc-content {
        color: var(--nc-content-text);
        font-size: 1.6rem; 
        line-height: 1.75;
        transition: color 0.3s;
    }

     
    .nc-content p { margin-bottom: 1em; }
    .nc-content p:last-child { margin-bottom: 0; }
    
    .nc-content ul { padding-left: 20px; color: inherit; }
    .nc-content li { margin-bottom: 6px; }
&lt;/style&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-80&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        满族发祥于我国东北，历史悠久，源远流长。其先民从周代的肃慎、战国秦汉时期的挹娄、魏晋时期的勿吉、隋唐时期的靺鞨、辽金乃至元代的女真，均在各代正史中有所记载，且有大量文物古迹作为研究佐证。至于明代女真的史料，无论是《明实录》《明史》等官修史料，还是笔记、游记等诸多私人著述，数量庞大，分布零散，故研究明代女真史的研究论著虽为数众多，但论题却较为分散，难成系统。中央民族大学历史文化学院赵令志教授与东北大学秦皇岛分校民族学学院李小雪老师合著的《明代女真史》填补了这一研究空缺。该书从族源考证、周边影响、卫所南迁、统一聚合、建立金国、奠定大清及文化习俗、姓氏特点等方面入手，以现代民族历史研究的新视角，结合中华民族交往交流交融史的理论视角，完整而系统地阐述了明代女真人的发展历史，以揭示明代女真人何以崛起并在更改族称后很快入主中原的历史变局中的因果关系。
    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-80&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-81&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        《朝鲜王朝实录》是记载明代女真历史所依重的基础史料，因国内一直难以系统查阅，造成了诸多利用不便。国内学者普遍习用的《明实录》，亦因卷帙浩繁，女真内容零散纷杂，搜罗齐备有一定难度。史料的限制，使得国内学界对明代女真的研究相对薄弱。日本学者河内良弘撰写《明代女真史研究》，曾对《朝鲜王朝实录》中明代女真史料进行了辑佚与整理。赵令志先生在翻译该著作的过程中，收集了《朝鲜王朝实录》中大量有关明代女真的资料，并在前辈学者的基础上进行了翔实的考证与补充，将《朝鲜王朝实录》与《明实录》仔细对勘，突破了零散、细碎的史料局限，整体性地呈现了明代女真的状况。
    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-81&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-82&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        重视和使用满文文献是该书的一大特色。作者通过对《满文老档》太祖朝所载明末海西女真的三百六十四道敕书的细致分析，梳理出所属海西羁縻卫所的分布及其在明中后期女真所谓敕书的袭替情况，指出海西女真卫所敕书一直被明朝兵部武选司掌控，到明朝末年海西女真仍分布较广，故不能将海西女真等同于扈伦四部，从而纠正了《满族简史》等著作中海西女真即扈伦四部的观点。根据这批敕书，作者还进一步分析了明朝嘉靖中对女真卫所朝贡贸易政策之变化，即明朝分别确定海西女真以一千道敕书从开原入贡贸易、建州女真以五百道敕书从抚顺入贡贸易，每道敕书每年以一人一马入边，改变了以往凭着一道敕书可以多人一起入边的政策。同时规定距离明朝较远的女真人，可以“朝贡不常”，不限时日，这部分女真人被明朝列为“野人女真”，自此，明朝方将女真人分为建州、海西、野人三部分。《明仁宗实录》之前的各朝实录中常出现的“野人女直”“女直野人”的称呼，从蔑称变为专属名称，嘉靖中叶以后则以“女直夷人”取代。且明朝官书中并没有“东海女真”的称呼，“东海女真”最早见于《满文老档》，其中将呼儿哈、瓦尔喀、窝集称为“东海三部”，三部之人称为“东海女真”，从而厘清了何谓“野人女真”的疑案，并指出野人女真的范围和所属，不能将东海女真等同于野人女真。这一创新观点对研究明代女真史和满族史将产生重要影响。
    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-82&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-83&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        &lt;p&gt;借助满文文献，该书对学界存在争议的汗号、国号、年号等问题进行梳理和释疑，认为努尔哈齐的汗号abka geren gurun be ujikini seme sindaha genggiyen han 的译文很多，译作“天任抚育列国之英明汗”是最准确的，即上天委任抚育各国之英明汗。许多学者将此翻译为“承天命养育列国英明汗”“承奉天命养育列国英明汗”等，而认为汗号中含有“天命”年号的性质，不够准确。abkai fulingga（天命）与abka……sindaha（天委任）的含义是有区别的。但此汗号已具有蒙古语“合罕”的含义，故此次称汗，具有北方游牧或渔猎民族称汗建国的性质。&lt;/p&gt;
&lt;p&gt;关于天命、天聪作为年号问题，蔡美彪先生早有疑问之论，但未得到学界认可。本书根据《满文原档》的记载，认为努尔哈齐时期并没有“年号”，而是以干支纪年和岁次纪年。在后修的《清太祖高皇帝实录》里，对此次进表称汗的记载中，附加“建元天命，以是年为天命元年”，看似天命年号在称汗建国时已使用。但在当时的文献中，并未见到该年号，而在《满文原档》中纪年仍用干支纪年，《实录》里从天命二年始用“天命太祖英明汗第二年”，满文为abkai fulinggai taidzu genggiyen han i jai aniya，可以推测，天命年号应该是皇太极时期编修《太祖太后实录》时才确定的。从满文档案来看，努尔哈齐时期纪年方式是干支纪年，故“天命”并非当时的年号。如“天命”一样，“天聪”亦并非年号，乃天聪汗第X年之纪年方式在汉文中的简写，满文为sure han之第X年。sure han乃皇太极之汗号，为“聪睿汗”之意，其中并无“天聪”之“天”（abkai）的含义，因而满文原意与汉文是对不上的。年号“崇德”，满文为wesihun erdemungge，字意与汉文相同，乃入关前之真正年号，亦为针对“崇祯”年号之产物，乃因皇太极将自己之“崇敬道德”，比之“崇敬祯祥”更高一层之故。皇太极称帝后才有年号，或许更能阐释中国历史上自汉武帝设定年号以来，帝有年号、汗无年号的年号使用特征。
至于aisin gurun国号之aisin，在万历四十四年（1616）之前已使用，如在万历四十一年（1613），出现sure kundulen han amba gurun be isabufi，aisin doro be jafafi banjire 之语，汉文译作“聪睿恭敬汗集成大业，执金国之政”（《内阁藏本满文老档》太祖朝第一函，满文见第一册，78页；汉文见第十九册，第6页），此处aisin doro或可译作“金政”，但可知在此时已用aisin为政权名称，此大概与建州女真一直认为“大金乃我远祖”“幹（斡）朵里乃大金之裔”的认同有关。努尔哈齐曾多次表露此观点，如天命四年三月对朝鲜称，julge meni aisin dai ding han de（昔我金大定帝时），天命六年三月对汉人称julge meni aisin han（昔我金帝）、julge suweni nikan i joo hoidzung joo kindzungjuwe han inu meni aisin han de jafabufi（昔尔汉人之赵徽宗、赵钦宗二皇帝，亦为我金汗所俘）等，均可反映出努尔哈齐对金朝作为其先祖的认同，因而在建州女真人中多仍沿用“金”作为国号，此问题日本学者神田信夫、河内良弘均有专论。1616年努尔哈齐建国称汗后，将aisin定为国号。国外学者一般称之为“爱新国”，乃女真语直译。但在当时汉文的史料，将其称作“金”或“后金”。还有学者认为称“金”尚可，称“后金”欠妥，其实在《满文原档》天命六年三月二十一日中，出现了amaga aisin gurun i han solho han de bithe unggirengge（后金国汗致书朝鲜国王）的用法，虽然较少，但仍可知道满文是有amaga aisin gurun（后金国）一词的。但如此书写，仅见此国书，无普遍性，故应以aisin gurun为准。另从当时该政权的印abkai fulingga aisin gurun han i doron，即“天命爱新国汗之印”来看，aisin gurun应该最为准确。至于“大清”国号之语义，如“大元”（daiyuwan gurun）、“大明” （daiming gurun）等国号一样，来源于汉语。满文之daicing，乃汉语“大清”之拼写。按古代国号必有所典之制，“大清”一词，或典出《管子》卷十三《心术篇》中的“镜大清者，视乎大明”，以及《管子》卷十六《内业篇》中的“鉴于大清，视于大明”，乃针对“大明”之国号。近来有学者认为来源于蒙古语“daičing”（英勇之意），音虽相近，然与历代定国号之史实不符。且如前引，天聪九年十二月皇太极告祭其父表文所言，“蒙古诸国尽归一统，惟有明国尚为我敌”，因而商定国号，要针对敌国明朝。另按五行之说，金木水火土相生相克，明以火旺，清以水兴，水可灭火，乃清将灭明之寓意。当时在金国有大量儒臣，汉文化影响较大，且努尔哈齐既通五行，并影响其子侄，皇太极在各方面受儒家思想影响较大，因而，此说应该更符合“大清”国号之本意。&lt;/p&gt;
&lt;p&gt;以上利用满文文献进行考订，解决了学界长期以来的争议。对“天命”“天聪”作为年号释疑，只能让学界明确其来历，不可能废止不用。而对国号的考订，可以纠正将“金国”写作“大金”“后金”等错误用法。&lt;/p&gt;

    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-83&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;
&lt;h3 id=&#34;什么是激浪派它跟中国有什么关系听策展人讲&#34;&gt;什么是“激浪派”，它跟中国有什么关系？听策展人讲
&lt;/h3&gt;&lt;div class=&#34;note-card&#34;&gt;
    &lt;div class=&#34;nc-accent&#34;&gt;&lt;/div&gt;

    &lt;div class=&#34;nc-header&#34;&gt;
        &lt;div class=&#34;nc-meta&#34;&gt;
            &lt;span class=&#34;nc-badge&#34;&gt;READING&lt;/span&gt;
            &lt;span class=&#34;nc-date&#34;&gt;2025-10-09&lt;/span&gt;
        &lt;/div&gt; &lt;a href=&#34;https://m.thepaper.cn/detail/31683034&#34; target=&#34;_blank&#34; class=&#34;nc-title&#34; title=&#34;访问原文&#34;&gt;
            什么是“激浪派”，它跟中国有什么关系？听策展人讲
            &lt;svg class=&#34;nc-link-icon&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
        &lt;/a&gt;
    &lt;/div&gt;

    
    &lt;div class=&#34;nc-context&#34;&gt;
        &lt;div class=&#34;nc-quote-icon&#34;&gt;“&lt;/div&gt;
        &lt;div class=&#34;nc-summary-text&#34;&gt;Fluxus，一个源于20世纪50-60年代欧洲和美国的先锋艺术运动，旨在融合艺术与生活。“意想不到！Fluxus！”上海展览是其在中国首次全面展出。本次展览由Frédéric Paul策划，展出了国际艺术家的作品，以及黄永砯等中国艺术家的作品，突显了Fluxus的包容性以及中国艺术家在该运动叙事中的重要作用。展览强调艺术的概念性和精神本质，超越了传统形式。&lt;/div&gt;
    &lt;/div&gt;
    

    
    
    
&lt;/div&gt;

&lt;style&gt;
     
    .note-card {
         
        --nc-bg-card: #ffffff;
        --nc-border: rgba(0,0,0,0.04);
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.08);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.12);
        
        --nc-title: #2c3e50;
        --nc-title-hover: #3a7bd5;
        --nc-meta: #999999;
        
        --nc-bg-context: #f8f9fa;
        --nc-border-context: #e2e8f0;
        --nc-quote-icon: #e2e8f0;
        --nc-text-summary: #555555;
        
        --nc-label-bg: #ffffff;
        --nc-label-text: #2d3748;
        --nc-content-text: #2d3748;
        --nc-link-icon: #cbd5e0;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.1);
        --nc-badge-text: #3a7bd5;

        position: relative;
        background: var(--nc-bg-card);
        border-radius: 12px;
        box-shadow: var(--nc-shadow);
        margin: 2.5rem 0;
        overflow: hidden;
        border: 1px solid var(--nc-border);
        font-family: inherit; 
        transition: transform 0.3s ease, box-shadow 0.3s ease, background 0.3s, border-color 0.3s;
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .note-card {
            --nc-bg-card: #1e1e1e;
            --nc-border: #333333;
            --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
            --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
            
            --nc-title: #f0f0f0;
            --nc-meta: #999999;
            
            --nc-bg-context: #252525;
            --nc-border-context: #444444;
            --nc-quote-icon: #333333;
            --nc-text-summary: #aaaaaa;
            
            --nc-label-bg: #1e1e1e;
            --nc-label-text: #cccccc;
            --nc-content-text: #dddddd;
            --nc-link-icon: #666666;
            
            --nc-badge-bg: rgba(58, 123, 213, 0.2);
        }
    }

    html[data-scheme=&#34;dark&#34;] .note-card {
        --nc-bg-card: #1e1e1e;
        --nc-border: #333333;
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
        
        --nc-title: #f0f0f0;
        --nc-meta: #999999;
        
        --nc-bg-context: #252525;
        --nc-border-context: #444444;
        --nc-quote-icon: #333333;
        --nc-text-summary: #aaaaaa;
        
        --nc-label-bg: #1e1e1e;
        --nc-label-text: #cccccc;
        --nc-content-text: #dddddd;
        --nc-link-icon: #666666;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.2);
    }

    .note-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--nc-shadow-hover);
    }

     
    .nc-accent {
        height: 4px;
        background: linear-gradient(90deg, #3a7bd5, #00d2ff); 
        width: 100%;
    }

     
    .nc-header {
        padding: 24px 28px 10px; 
    }

    .nc-meta {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 10px; 
        font-size: 13px; 
        color: var(--nc-meta);
        font-weight: 600;
        letter-spacing: 1px;
        text-transform: uppercase;
    }

    .nc-badge {
        color: var(--nc-badge-text);
        background: var(--nc-badge-bg);
        padding: 2px 6px;
        border-radius: 4px;
    }

    .nc-title {
        display: block;
        font-size: 2rem; 
        font-weight: 700;
        color: var(--nc-title);
        text-decoration: none;
        line-height: 1.3;
        transition: color 0.2s;
    }

    .nc-title:hover {
        color: var(--nc-title-hover);
    }

    .nc-link-icon {
        width: 20px; 
        height: 20px;
        color: var(--nc-link-icon);
        margin-left: 5px;
        vertical-align: middle;
        transition: color 0.2s;
    }

    .nc-title:hover .nc-link-icon {
        color: var(--nc-title-hover);
    }

     
    .nc-context {
        margin: 12px 28px 24px;
        background: var(--nc-bg-context);
        padding: 20px 24px;
        border-radius: 8px;
        position: relative;
        border-left: 4px solid var(--nc-border-context);
        transition: background 0.3s, border-color 0.3s;
    }

    .nc-quote-icon {
        position: absolute;
        top: 8px;
        left: 10px;
        font-family: serif; 
        font-size: 40px;
        line-height: 1;
        color: var(--nc-quote-icon);
        pointer-events: none;
        transition: color 0.3s;
    }

    .nc-summary-text {
        font-size: 1.7rem; 
        color: var(--nc-text-summary);
        line-height: 1.6;
        font-style: italic;
        position: relative;
        z-index: 1;
        padding-left: 15px; 
        transition: color 0.3s;
    }

     
    .nc-body {
        padding: 0 28px 32px;
        position: relative;
    }

     
    .nc-label {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        font-size: 13px; 
        font-weight: 700;
        color: var(--nc-label-text);
        background: var(--nc-label-bg);
        padding-right: 10px;
        margin-bottom: 12px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
        transition: color 0.3s, background 0.3s;
    }

    .nc-content {
        color: var(--nc-content-text);
        font-size: 1.6rem; 
        line-height: 1.75;
        transition: color 0.3s;
    }

     
    .nc-content p { margin-bottom: 1em; }
    .nc-content p:last-child { margin-bottom: 0; }
    
    .nc-content ul { padding-left: 20px; color: inherit; }
    .nc-content li { margin-bottom: 6px; }
&lt;/style&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-85&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        “偶然！激浪派！”正在上海西岸美术馆展出的，这是西岸美术馆与法国蓬皮杜中心新一轮五年展陈合作项目的首个特展，也是激浪派在中国首次整体展出。展出中，除了大量欧美艺术家的作品外，也有黄永砯等中国艺术家的作品。巴黎蓬皮杜艺术中心策展人费雷德里克·保罗（Frédéric Paul）近日接受《澎湃新闻｜艺术评论》专访时表示，激浪派是“最具包容性的艺术运动”，中国艺术家的作品在展览中贯穿始终，是因为他们作品本身具有不可或缺的重要性，而不是出于礼貌。
    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-85&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;
&lt;h3 id=&#34;seen-and-remembered-by-the-mountains-polyphonies-of-friendship-in-liangshan-群山所见与所念凉山友谊的复调之歌&#34;&gt;Seen and Remembered by the Mountains: Polyphonies of Friendship in Liangshan 群山所见与所念：凉山友谊的复调之歌
&lt;/h3&gt;&lt;div class=&#34;note-card&#34;&gt;
    &lt;div class=&#34;nc-accent&#34;&gt;&lt;/div&gt;

    &lt;div class=&#34;nc-header&#34;&gt;
        &lt;div class=&#34;nc-meta&#34;&gt;
            &lt;span class=&#34;nc-badge&#34;&gt;READING&lt;/span&gt;
            &lt;span class=&#34;nc-date&#34;&gt;2025-10-09&lt;/span&gt;
        &lt;/div&gt; &lt;a href=&#34;http://www.leapleapleap.com/2025/09/seen-and-remembered-by-the-mountains1-polyphonies-of-friendship-in-liangshan/&#34; target=&#34;_blank&#34; class=&#34;nc-title&#34; title=&#34;访问原文&#34;&gt;
            Seen and Remembered by the Mountains: Polyphonies of Friendship in Liangshan 群山所见与所念：凉山友谊的复调之歌
            &lt;svg class=&#34;nc-link-icon&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
        &lt;/a&gt;
    &lt;/div&gt;

    
    &lt;div class=&#34;nc-context&#34;&gt;
        &lt;div class=&#34;nc-quote-icon&#34;&gt;“&lt;/div&gt;
        &lt;div class=&#34;nc-summary-text&#34;&gt;作者通过朋友们的故事，探讨了凉山复杂的身份认同和对土地的持久联系：记录传统音乐的尔义日布；致力于传承彝族语言和文化的教师苏日格哈；书写命运与韧性的作家阿西阿呷；推广彝族遗产的活动家吉迪日渡；以及挣扎于流离失所与归属感的艺术家舍阳斯波。叙事强调了山峦如何铭记并塑造着他们的生活。&lt;/div&gt;
    &lt;/div&gt;
    

    
    
    
&lt;/div&gt;

&lt;style&gt;
     
    .note-card {
         
        --nc-bg-card: #ffffff;
        --nc-border: rgba(0,0,0,0.04);
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.08);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.12);
        
        --nc-title: #2c3e50;
        --nc-title-hover: #3a7bd5;
        --nc-meta: #999999;
        
        --nc-bg-context: #f8f9fa;
        --nc-border-context: #e2e8f0;
        --nc-quote-icon: #e2e8f0;
        --nc-text-summary: #555555;
        
        --nc-label-bg: #ffffff;
        --nc-label-text: #2d3748;
        --nc-content-text: #2d3748;
        --nc-link-icon: #cbd5e0;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.1);
        --nc-badge-text: #3a7bd5;

        position: relative;
        background: var(--nc-bg-card);
        border-radius: 12px;
        box-shadow: var(--nc-shadow);
        margin: 2.5rem 0;
        overflow: hidden;
        border: 1px solid var(--nc-border);
        font-family: inherit; 
        transition: transform 0.3s ease, box-shadow 0.3s ease, background 0.3s, border-color 0.3s;
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .note-card {
            --nc-bg-card: #1e1e1e;
            --nc-border: #333333;
            --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
            --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
            
            --nc-title: #f0f0f0;
            --nc-meta: #999999;
            
            --nc-bg-context: #252525;
            --nc-border-context: #444444;
            --nc-quote-icon: #333333;
            --nc-text-summary: #aaaaaa;
            
            --nc-label-bg: #1e1e1e;
            --nc-label-text: #cccccc;
            --nc-content-text: #dddddd;
            --nc-link-icon: #666666;
            
            --nc-badge-bg: rgba(58, 123, 213, 0.2);
        }
    }

    html[data-scheme=&#34;dark&#34;] .note-card {
        --nc-bg-card: #1e1e1e;
        --nc-border: #333333;
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
        
        --nc-title: #f0f0f0;
        --nc-meta: #999999;
        
        --nc-bg-context: #252525;
        --nc-border-context: #444444;
        --nc-quote-icon: #333333;
        --nc-text-summary: #aaaaaa;
        
        --nc-label-bg: #1e1e1e;
        --nc-label-text: #cccccc;
        --nc-content-text: #dddddd;
        --nc-link-icon: #666666;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.2);
    }

    .note-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--nc-shadow-hover);
    }

     
    .nc-accent {
        height: 4px;
        background: linear-gradient(90deg, #3a7bd5, #00d2ff); 
        width: 100%;
    }

     
    .nc-header {
        padding: 24px 28px 10px; 
    }

    .nc-meta {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 10px; 
        font-size: 13px; 
        color: var(--nc-meta);
        font-weight: 600;
        letter-spacing: 1px;
        text-transform: uppercase;
    }

    .nc-badge {
        color: var(--nc-badge-text);
        background: var(--nc-badge-bg);
        padding: 2px 6px;
        border-radius: 4px;
    }

    .nc-title {
        display: block;
        font-size: 2rem; 
        font-weight: 700;
        color: var(--nc-title);
        text-decoration: none;
        line-height: 1.3;
        transition: color 0.2s;
    }

    .nc-title:hover {
        color: var(--nc-title-hover);
    }

    .nc-link-icon {
        width: 20px; 
        height: 20px;
        color: var(--nc-link-icon);
        margin-left: 5px;
        vertical-align: middle;
        transition: color 0.2s;
    }

    .nc-title:hover .nc-link-icon {
        color: var(--nc-title-hover);
    }

     
    .nc-context {
        margin: 12px 28px 24px;
        background: var(--nc-bg-context);
        padding: 20px 24px;
        border-radius: 8px;
        position: relative;
        border-left: 4px solid var(--nc-border-context);
        transition: background 0.3s, border-color 0.3s;
    }

    .nc-quote-icon {
        position: absolute;
        top: 8px;
        left: 10px;
        font-family: serif; 
        font-size: 40px;
        line-height: 1;
        color: var(--nc-quote-icon);
        pointer-events: none;
        transition: color 0.3s;
    }

    .nc-summary-text {
        font-size: 1.7rem; 
        color: var(--nc-text-summary);
        line-height: 1.6;
        font-style: italic;
        position: relative;
        z-index: 1;
        padding-left: 15px; 
        transition: color 0.3s;
    }

     
    .nc-body {
        padding: 0 28px 32px;
        position: relative;
    }

     
    .nc-label {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        font-size: 13px; 
        font-weight: 700;
        color: var(--nc-label-text);
        background: var(--nc-label-bg);
        padding-right: 10px;
        margin-bottom: 12px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
        transition: color 0.3s, background 0.3s;
    }

    .nc-content {
        color: var(--nc-content-text);
        font-size: 1.6rem; 
        line-height: 1.75;
        transition: color 0.3s;
    }

     
    .nc-content p { margin-bottom: 1em; }
    .nc-content p:last-child { margin-bottom: 0; }
    
    .nc-content ul { padding-left: 20px; color: inherit; }
    .nc-content li { margin-bottom: 6px; }
&lt;/style&gt;
&lt;h3 id=&#34;潘玮琳评以竹为生重新认识现代中国工业化中看不见的劳作&#34;&gt;潘玮琳评《以竹为生》｜重新认识现代中国工业化中“看不见的劳作”
&lt;/h3&gt;&lt;div class=&#34;note-card&#34;&gt;
    &lt;div class=&#34;nc-accent&#34;&gt;&lt;/div&gt;

    &lt;div class=&#34;nc-header&#34;&gt;
        &lt;div class=&#34;nc-meta&#34;&gt;
            &lt;span class=&#34;nc-badge&#34;&gt;READING&lt;/span&gt;
            &lt;span class=&#34;nc-date&#34;&gt;2025-10-09&lt;/span&gt;
        &lt;/div&gt; &lt;a href=&#34;https://www.thepaper.cn/newsDetail_forward_31699548&#34; target=&#34;_blank&#34; class=&#34;nc-title&#34; title=&#34;访问原文&#34;&gt;
            潘玮琳评《以竹为生》｜重新认识现代中国工业化中“看不见的劳作”
            &lt;svg class=&#34;nc-link-icon&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
        &lt;/a&gt;
    &lt;/div&gt;

    
    &lt;div class=&#34;nc-context&#34;&gt;
        &lt;div class=&#34;nc-quote-icon&#34;&gt;“&lt;/div&gt;
        &lt;div class=&#34;nc-summary-text&#34;&gt;这篇评论讨论了雅各布·艾弗思（Jacob Eyferth）的著作《竹根食米》（Eating Rice from Bamboo Roots），该书详述了20世纪中国四川农村手工造纸的社会历史。该书通过强调技艺精湛的手工艺人和女性的“看不见的劳动”，挑战了关于工业化的传统叙事，认为现代化常常边缘化了传统手工艺和知识。它探讨了这些手工艺如何融入社会关系和社区繁衍，从而为中国的工业化和知识生产提供了细致入微的视角。&lt;/div&gt;
    &lt;/div&gt;
    

    
    
    
&lt;/div&gt;

&lt;style&gt;
     
    .note-card {
         
        --nc-bg-card: #ffffff;
        --nc-border: rgba(0,0,0,0.04);
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.08);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.12);
        
        --nc-title: #2c3e50;
        --nc-title-hover: #3a7bd5;
        --nc-meta: #999999;
        
        --nc-bg-context: #f8f9fa;
        --nc-border-context: #e2e8f0;
        --nc-quote-icon: #e2e8f0;
        --nc-text-summary: #555555;
        
        --nc-label-bg: #ffffff;
        --nc-label-text: #2d3748;
        --nc-content-text: #2d3748;
        --nc-link-icon: #cbd5e0;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.1);
        --nc-badge-text: #3a7bd5;

        position: relative;
        background: var(--nc-bg-card);
        border-radius: 12px;
        box-shadow: var(--nc-shadow);
        margin: 2.5rem 0;
        overflow: hidden;
        border: 1px solid var(--nc-border);
        font-family: inherit; 
        transition: transform 0.3s ease, box-shadow 0.3s ease, background 0.3s, border-color 0.3s;
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .note-card {
            --nc-bg-card: #1e1e1e;
            --nc-border: #333333;
            --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
            --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
            
            --nc-title: #f0f0f0;
            --nc-meta: #999999;
            
            --nc-bg-context: #252525;
            --nc-border-context: #444444;
            --nc-quote-icon: #333333;
            --nc-text-summary: #aaaaaa;
            
            --nc-label-bg: #1e1e1e;
            --nc-label-text: #cccccc;
            --nc-content-text: #dddddd;
            --nc-link-icon: #666666;
            
            --nc-badge-bg: rgba(58, 123, 213, 0.2);
        }
    }

    html[data-scheme=&#34;dark&#34;] .note-card {
        --nc-bg-card: #1e1e1e;
        --nc-border: #333333;
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
        
        --nc-title: #f0f0f0;
        --nc-meta: #999999;
        
        --nc-bg-context: #252525;
        --nc-border-context: #444444;
        --nc-quote-icon: #333333;
        --nc-text-summary: #aaaaaa;
        
        --nc-label-bg: #1e1e1e;
        --nc-label-text: #cccccc;
        --nc-content-text: #dddddd;
        --nc-link-icon: #666666;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.2);
    }

    .note-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--nc-shadow-hover);
    }

     
    .nc-accent {
        height: 4px;
        background: linear-gradient(90deg, #3a7bd5, #00d2ff); 
        width: 100%;
    }

     
    .nc-header {
        padding: 24px 28px 10px; 
    }

    .nc-meta {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 10px; 
        font-size: 13px; 
        color: var(--nc-meta);
        font-weight: 600;
        letter-spacing: 1px;
        text-transform: uppercase;
    }

    .nc-badge {
        color: var(--nc-badge-text);
        background: var(--nc-badge-bg);
        padding: 2px 6px;
        border-radius: 4px;
    }

    .nc-title {
        display: block;
        font-size: 2rem; 
        font-weight: 700;
        color: var(--nc-title);
        text-decoration: none;
        line-height: 1.3;
        transition: color 0.2s;
    }

    .nc-title:hover {
        color: var(--nc-title-hover);
    }

    .nc-link-icon {
        width: 20px; 
        height: 20px;
        color: var(--nc-link-icon);
        margin-left: 5px;
        vertical-align: middle;
        transition: color 0.2s;
    }

    .nc-title:hover .nc-link-icon {
        color: var(--nc-title-hover);
    }

     
    .nc-context {
        margin: 12px 28px 24px;
        background: var(--nc-bg-context);
        padding: 20px 24px;
        border-radius: 8px;
        position: relative;
        border-left: 4px solid var(--nc-border-context);
        transition: background 0.3s, border-color 0.3s;
    }

    .nc-quote-icon {
        position: absolute;
        top: 8px;
        left: 10px;
        font-family: serif; 
        font-size: 40px;
        line-height: 1;
        color: var(--nc-quote-icon);
        pointer-events: none;
        transition: color 0.3s;
    }

    .nc-summary-text {
        font-size: 1.7rem; 
        color: var(--nc-text-summary);
        line-height: 1.6;
        font-style: italic;
        position: relative;
        z-index: 1;
        padding-left: 15px; 
        transition: color 0.3s;
    }

     
    .nc-body {
        padding: 0 28px 32px;
        position: relative;
    }

     
    .nc-label {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        font-size: 13px; 
        font-weight: 700;
        color: var(--nc-label-text);
        background: var(--nc-label-bg);
        padding-right: 10px;
        margin-bottom: 12px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
        transition: color 0.3s, background 0.3s;
    }

    .nc-content {
        color: var(--nc-content-text);
        font-size: 1.6rem; 
        line-height: 1.75;
        transition: color 0.3s;
    }

     
    .nc-content p { margin-bottom: 1em; }
    .nc-content p:last-child { margin-bottom: 0; }
    
    .nc-content ul { padding-left: 20px; color: inherit; }
    .nc-content li { margin-bottom: 6px; }
&lt;/style&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-88&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        2009年，哈佛大学亚洲研究中心出版了艾约博（Jacob Eyferth）的Eating Rice from Bamboo Roots: The Social History of a Community of Handicraft Papermakers in Rural Sichuan，1920–2000。该书对四川夹江县石堰村手工造纸业的细致描绘，在国际中国学界引起广泛关注。2016年，经韩巍、吴秀杰译校，江苏人民出版社“凤凰文库·海外中国研究系列”推出了中文版《以竹为生：一个四川手工造纸村的20世纪社会史》，2024年又将其收入“海外中国研究丛书·精选版”。这本书的再版，恰好响应了学界对技术史、手工业史与社会史的关注再起。
    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-88&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-89&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        自该书中英文版问世以来，学界已有近十篇书评，高度评价其对县志、地方档案、行业调查、民族志与口述史资料的结合运用，认为它生动再现了二十世纪四川乡村手工业的日常状况；同时也肯定了该书的理论探讨价值。艾约博针对近代中国农村手工业兴衰这一经典命题，通过“去工业化”（de-industrialization）与“去技能化”（de-skilling）的分析维度，挑战了诸如农村工业化来自城市溢出效应、并且是现代化建设的自然路径的传统叙事，试图揭示现代化进程中国家政策干预与区域经济变迁的复杂因果。尽管夹江手工造纸业是小规模、分散型家庭作坊，但是艾约博并不视之为“落后的残余”，而是解读为一种对生态与市场条件的适应性产业，蕴含高度的专业技能与市场价值。在“原工业化”（proto-industrialization）的解释模型中，这类高度市场化、区域性专门化的家庭手工副业，本可成为通向现代经济的路径之一；然而在强调“现代工业化”的过程中，传统手工业技艺不再是社会中受尊重的资本，反而成为一种“低端劳动”，构成了现代化的悖论。
    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-89&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-90&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        &lt;p&gt;《以竹为生》的上述观点，源自作者对“结构性约束下的日常生活”的持续关注。近年来，艾约博曾发表过关于文浩（Felix Wemheuer）的《毛泽东时代中国的社会史：1949-1976》(A Social History of Maoist China，1949–1976，2019年)、罗伯特·克莱夫（Robert Cliver）的《红绸：中国长三角丝织厂的阶级、性别与革命》（Red Silk：Class，Gender，and Revolution in China’s Yangzi Delta Silk Industry，2021年）、周淑萱的《从林场到锯木厂：劳动、性别与中国国家的叙事》（From Forest Farm to Sawmill: Stories of Labor，Gender，and the Chinese State，2024年）等海外中国学新作的书评。这些著作均关注并讨论二十世纪下半叶中国产业变迁中的劳动再组织，尤其是性别如何在劳动控制与分配中被制度化的问题，呼应并延续了艾约博对国家工业化叙事的反思。&lt;/p&gt;
&lt;p&gt;在《以竹为生》之后，艾约博投入了关于四川、陕西和华北农村家庭妇女纺织的民族志与历史学研究。从造纸业男性工匠的技能与劳动地位，转向女性的家庭手工劳作，他依然试图解释，这些被边缘化的劳作，如何在国家工业化话语下持续存在，并在地方社会中发挥关键作用。艾约博注意到，在共和国的前三十年，即便国家大力推动工厂化生产，农村妇女依旧长期从事费时费力的家庭纺织。除了特定历史时期存在的制度性短缺，家庭纺织的“社区再生产”（community reproduction）功能亦至关重要。这种非正式的、甚至被贬低的家务性劳动，不仅是一种物质生产，更是农村日常礼仪循环（嫁娶、丧葬、馈赠）中必不可少的交换媒介。农村妇女的纺织、养猪、拾柴、采集等其他非工资性劳动，被国家隐形吸纳，并且成为农村社区运行的必要支撑——这正是国家经济发展背后“看不见的劳作”。
从“去技能化”到“看不见的劳作”，艾约博的研究逐步将技术史、劳作史与性别史交织在一起，转向社会再生产功能的探讨。社会再生产涵盖生育、抚育、教育、家务、食物与衣物制作、礼物交换与人情往来等活动，它既与生产相对，又是生产的前提。地方层面的社会再生产，不仅在家庭内部展开，还通过社区互助、宗族关系、礼仪循环与地方市场维系着自身的延续和稳定，这正是所谓的“社区再生产”。
在《以竹为生》中，尽管没有刻意强调这一概念，但作者对夹江山区的社区和宗族、市场和社区以及家庭生产的分析，实际上揭示了类似逻辑。他特别强调“技能的共同体”（详见该书第二章“夹江山区的社区和宗族”），指出造纸不仅是经济活动，更是一套嵌入社会关系的技能体系，既包括打浆、刷纸的技术性知识，也包括如何寻找买家、与邻居相处的社会性技能。这些技能更像是一种社会资本，通过亲属关系、婚姻、学徒制与村落网络，被管理与传递。夹江山区的经济活动完全是围绕这种社会资本展开的，因此，社区内部联结的核心逻辑超越了单纯的血脉继嗣。&lt;/p&gt;

    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-90&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-91&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        &lt;p&gt;正是基于这一认识，艾约博进一步提出，二十世纪国家主导的工业化“在很大程度上是对技能、知识、技术掌控的再分配”，他甚至认为，在技术转型的层面，“中国的革命”是“技术掌控权大规模地从农村转移到城市，从一线生产者手中转移到管理层精英手中，从女性身上转移到男性身上”，而中国的“城乡分野部分地是由于城乡之间在知识分配上的变化所造成的”（导论，第2页）。&lt;/p&gt;
&lt;p&gt;笔者的研究聚焦抗战时期西南地区造纸工业的技术创新与生产调整，因此，也将视野延伸到了成都与乐山之间的夹江山区。二十世纪战争的一个突出特点是以工业经济为基础的全面战争，因此生产动员成为战争的一个重要组成部分。纸张是战时重要的军事资源。在战时经济体制下，世界各国不约而同地增强了自给自足意识，采取战略物资的统制政策并寻求生产能力提升的技术创新。战时中国也概莫能外。抗战军兴，国民政府迁都重庆，在西南地区形成新的政治、文化、工商的中心，也开始在《西南西北工业建设计划》的整体规划下，对西南地区传统手工纸的“山乡造纸”模式进行改造，将利用现代化学工艺改良中国竹纸的科学实验和战时自主工业体系建设的进程联系起来。这正是《以竹为生》里夹江造纸业命运发生急剧转折的开端。&lt;/p&gt;

    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-91&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-92&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        &lt;p&gt;艾约博对于战时来自沿海地区的技术专家进行的“自上而下的改革”予以严厉批评，认为这些五花八门的改革提议，“从廉价可行的方案（从水泥浸池，使用更剧烈的化学剂）到天马行空的方案（撤销所有用竹浆制纸的工厂，代之以木浆制纸的工厂）……几乎全都认为手工业生产技术是低效和浪费的，这往往显示出他们对当地情况一无所知”。（121页）出于对专家“套取”槽户生产知识的批判性看法，他仅用五页篇幅描述了战时的竹纸改良。而笔者的研究，恰好关注的是艾约博并未过多着墨的这些技术专家。战时中国的造纸专业人士与实业家，亟力发展“新兴纸业”，改良土纸，希望找到一种既可突破生产原料限制，又可与分散型手工作业的生产方式相结合的应急办法。以中央工业试验所纤维研究所为代表的科学家设想将现代造纸的化工原理或生产工艺，经过最大程度的精简，应用到西南地区特有的植物纤维材料上，并通过系统地组织、帮扶和管理生产厂家或槽户，实现在完全人力或半机械设备的有限生产条件下最大限度的生产动员。他们在战前和战时所进行的大量民族志调查、实验室研究和试验工厂建设的种种努力，及其对战后中国造纸业发展方向的影响，构成了《以竹为生》叙事的另一侧面。&lt;/p&gt;
&lt;p&gt;《以竹为生》不仅让我们重新理解了传统手工技艺在现代化语境中的存续与边缘化，也提示我们去追问：在国家叙事与地方实践之间，哪些劳作被记录，哪些劳作被遮蔽？对于笔者所关心的课题而言，战时造纸技术专家们的故事，或许是另一个层面的“看不见的劳作”。从这个意义上说，对夹江手工造纸业的再考察，不只是对一个产业命运的补白，更是对现代中国工业化与知识生产多重逻辑的再揭示。&lt;/p&gt;

    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-92&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;
&lt;h3 id=&#34;专访陈辉老漂族与转型中国家庭的分离与团聚&#34;&gt;专访｜陈辉：老漂族与转型中国家庭的分离与团聚
&lt;/h3&gt;&lt;div class=&#34;note-card&#34;&gt;
    &lt;div class=&#34;nc-accent&#34;&gt;&lt;/div&gt;

    &lt;div class=&#34;nc-header&#34;&gt;
        &lt;div class=&#34;nc-meta&#34;&gt;
            &lt;span class=&#34;nc-badge&#34;&gt;READING&lt;/span&gt;
            &lt;span class=&#34;nc-date&#34;&gt;2025-10-09&lt;/span&gt;
        &lt;/div&gt; &lt;a href=&#34;https://m.thepaper.cn/detail/31640135&#34; target=&#34;_blank&#34; class=&#34;nc-title&#34; title=&#34;访问原文&#34;&gt;
            专访｜陈辉：老漂族与转型中国家庭的分离与团聚
            &lt;svg class=&#34;nc-link-icon&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
        &lt;/a&gt;
    &lt;/div&gt;

    
    &lt;div class=&#34;nc-context&#34;&gt;
        &lt;div class=&#34;nc-quote-icon&#34;&gt;“&lt;/div&gt;
        &lt;div class=&#34;nc-summary-text&#34;&gt;“老漂族”是指为了帮助抚养孙辈而迁居到子女所在城市的年长者，这是中国一个日益增长的人口群体。陈慧教授的研究强调，这种现象源于负担过重的核心家庭以及代际权力失衡。尽管面临社会适应的挑战，他们主要的困境是内在的，常常感到自己是未付费的家务劳动者。陈教授建议，要建立一个儿童友好型社会，需要平衡家庭伦理、相互理解，并在个人价值观与家庭价值观之间找到新的平衡点。&lt;/div&gt;
    &lt;/div&gt;
    

    
    
    
&lt;/div&gt;

&lt;style&gt;
     
    .note-card {
         
        --nc-bg-card: #ffffff;
        --nc-border: rgba(0,0,0,0.04);
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.08);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.12);
        
        --nc-title: #2c3e50;
        --nc-title-hover: #3a7bd5;
        --nc-meta: #999999;
        
        --nc-bg-context: #f8f9fa;
        --nc-border-context: #e2e8f0;
        --nc-quote-icon: #e2e8f0;
        --nc-text-summary: #555555;
        
        --nc-label-bg: #ffffff;
        --nc-label-text: #2d3748;
        --nc-content-text: #2d3748;
        --nc-link-icon: #cbd5e0;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.1);
        --nc-badge-text: #3a7bd5;

        position: relative;
        background: var(--nc-bg-card);
        border-radius: 12px;
        box-shadow: var(--nc-shadow);
        margin: 2.5rem 0;
        overflow: hidden;
        border: 1px solid var(--nc-border);
        font-family: inherit; 
        transition: transform 0.3s ease, box-shadow 0.3s ease, background 0.3s, border-color 0.3s;
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .note-card {
            --nc-bg-card: #1e1e1e;
            --nc-border: #333333;
            --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
            --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
            
            --nc-title: #f0f0f0;
            --nc-meta: #999999;
            
            --nc-bg-context: #252525;
            --nc-border-context: #444444;
            --nc-quote-icon: #333333;
            --nc-text-summary: #aaaaaa;
            
            --nc-label-bg: #1e1e1e;
            --nc-label-text: #cccccc;
            --nc-content-text: #dddddd;
            --nc-link-icon: #666666;
            
            --nc-badge-bg: rgba(58, 123, 213, 0.2);
        }
    }

    html[data-scheme=&#34;dark&#34;] .note-card {
        --nc-bg-card: #1e1e1e;
        --nc-border: #333333;
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
        
        --nc-title: #f0f0f0;
        --nc-meta: #999999;
        
        --nc-bg-context: #252525;
        --nc-border-context: #444444;
        --nc-quote-icon: #333333;
        --nc-text-summary: #aaaaaa;
        
        --nc-label-bg: #1e1e1e;
        --nc-label-text: #cccccc;
        --nc-content-text: #dddddd;
        --nc-link-icon: #666666;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.2);
    }

    .note-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--nc-shadow-hover);
    }

     
    .nc-accent {
        height: 4px;
        background: linear-gradient(90deg, #3a7bd5, #00d2ff); 
        width: 100%;
    }

     
    .nc-header {
        padding: 24px 28px 10px; 
    }

    .nc-meta {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 10px; 
        font-size: 13px; 
        color: var(--nc-meta);
        font-weight: 600;
        letter-spacing: 1px;
        text-transform: uppercase;
    }

    .nc-badge {
        color: var(--nc-badge-text);
        background: var(--nc-badge-bg);
        padding: 2px 6px;
        border-radius: 4px;
    }

    .nc-title {
        display: block;
        font-size: 2rem; 
        font-weight: 700;
        color: var(--nc-title);
        text-decoration: none;
        line-height: 1.3;
        transition: color 0.2s;
    }

    .nc-title:hover {
        color: var(--nc-title-hover);
    }

    .nc-link-icon {
        width: 20px; 
        height: 20px;
        color: var(--nc-link-icon);
        margin-left: 5px;
        vertical-align: middle;
        transition: color 0.2s;
    }

    .nc-title:hover .nc-link-icon {
        color: var(--nc-title-hover);
    }

     
    .nc-context {
        margin: 12px 28px 24px;
        background: var(--nc-bg-context);
        padding: 20px 24px;
        border-radius: 8px;
        position: relative;
        border-left: 4px solid var(--nc-border-context);
        transition: background 0.3s, border-color 0.3s;
    }

    .nc-quote-icon {
        position: absolute;
        top: 8px;
        left: 10px;
        font-family: serif; 
        font-size: 40px;
        line-height: 1;
        color: var(--nc-quote-icon);
        pointer-events: none;
        transition: color 0.3s;
    }

    .nc-summary-text {
        font-size: 1.7rem; 
        color: var(--nc-text-summary);
        line-height: 1.6;
        font-style: italic;
        position: relative;
        z-index: 1;
        padding-left: 15px; 
        transition: color 0.3s;
    }

     
    .nc-body {
        padding: 0 28px 32px;
        position: relative;
    }

     
    .nc-label {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        font-size: 13px; 
        font-weight: 700;
        color: var(--nc-label-text);
        background: var(--nc-label-bg);
        padding-right: 10px;
        margin-bottom: 12px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
        transition: color 0.3s, background 0.3s;
    }

    .nc-content {
        color: var(--nc-content-text);
        font-size: 1.6rem; 
        line-height: 1.75;
        transition: color 0.3s;
    }

     
    .nc-content p { margin-bottom: 1em; }
    .nc-content p:last-child { margin-bottom: 0; }
    
    .nc-content ul { padding-left: 20px; color: inherit; }
    .nc-content li { margin-bottom: 6px; }
&lt;/style&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-94&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        &lt;p&gt;离开老家到异地给子女带孩子的老年人，正成为中国城市化进程中一个独特而庞大的群体，被媒体称为“老漂族”。2015年国家统计局数据显示，老年流动人口中有43%是照顾晚辈生活的老人，将近800万。他们像候鸟一样，在故乡与子女所在城市之间迁徙，承担着抚育第三代的重任。&lt;/p&gt;
&lt;p&gt;西北农林科技大学人文社会发展学院教授陈辉在其新书《银发摆渡人》中，通过对老漂族的深入调研，揭示了当代中国家庭正经历的结构性困境：核心家庭因精细化育儿和职业压力而发生抚育功能超载，不得不依赖老人支持；家庭内部代际权力失衡，传统的无限责任伦理与现代个体化诉求之间存在张力。&lt;/p&gt;

    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-94&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-95&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        陈辉的研究方向为社会转型与家庭发展。在他看来，老漂现象不仅是人口流动的结果，更是社会调动老年人劳动力资源、促进人口再生产的一种模式。老漂族面临的最大问题不在于社会适应，而在家庭内部——他们处于“免费家政工”与“不受尊重的长辈”的双重角色困境中（159页）。在接受澎湃新闻专访时，陈辉认为，要建立生育友好型社会，除了增加生育补贴和教育补贴之外，还要注重家庭内部的伦理平衡，让代际之间、夫妻之间相互理解与支持，在个人价值与家庭价值之间找到新的平衡点，形成适应转型期的新家庭伦理。
    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-95&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;
&lt;h2 id=&#34;图像&#34;&gt;图像
&lt;/h2&gt;&lt;div class=&#34;hugo-gallery&#34; id=&#34;gallery-96&#34;&gt;
    &lt;div class=&#34;gallery-inline-layout&#34;&gt;
        
        &lt;div class=&#34;visual-column&#34;&gt;
            &lt;div class=&#34;gallery-viewport&#34;&gt;
                &lt;div class=&#34;gallery-track&#34;&gt;
                    
                        
                        
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20251009-image01.jpg&#34;
                                 data-src=&#34;20251009-image01.jpg&#34; 
                                 data-alt=&#34;豪滕镇的彩虹屋，荷兰&#34; 
                                 data-desc=&#34;你不会找到纪念品商店或旅游地图指引方向——但沿着豪滕的里特普拉斯湖畔，你会偶然发现荷兰最令人意想不到的上镜景点之一。虽然许多人涌向阿姆斯特丹的运河或鹿特丹的方块屋，但这座宁静的通勤小镇却拥有独特的建筑风格。彩虹屋如海市蜃楼般鳞次栉比，闪耀着大胆的绘画色彩——一个住宅区变成了一个低调的文化地标。   对当地人来说，它们只是日常生活的一部分。但对于摄影师和设计爱好者来说，它们是色彩饱和、对称的梦幻景观。该​​建筑群由汉斯·比恩 (Hans Been) 设计，于 2005 年竣工，将加勒比海风情与北欧的内敛风格融为一体，呼应了简约渔村的面貌。每栋房子都反射出不同的色彩。这不是一个精心策划的旅游景点；这些都是有人居住的住宅，它们所在的社区也经过了同样周到的规划，而豪滕正是凭借这种规划成为全国最适合骑自行车的城镇之一。从湖对岸或附近的桥上欣赏这些色彩鲜艳的建筑外观最为理想，它们就像一个秘密，只有在合适的光线下才能幸运地捕捉到：迷人、惊喜，而且低调得令人耳目一新。&#34;
                                 data-link=&#34;https://cn.bing.com/search?q=%e8%b1%aa%e6%bb%95%e9%95%87%e8%8d%b7%e5%85%b0&amp;amp;form=hpcapt&amp;amp;filters=HpDate:%2220250928_1600%22&amp;#43;mgzv3configlist:%22BingQA_Encyclopedia_Layout%22&#34;&gt;
                                &lt;img src=&#34;20251009-image01.jpg&#34; alt=&#34;豪滕镇的彩虹屋，荷兰&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20251009-image02.jpg&#34;
                                 data-src=&#34;20251009-image02.jpg&#34; 
                                 data-alt=&#34;莱蒙彗星逐渐变亮&#34; 
                                 data-desc=&#34;莱蒙（Lemmon）彗星正持续增亮，并逐渐移入北半球的晨空。当前除了SWAN25B彗星与ATLAS彗星之外，C/2025 A6（莱蒙）彗星已成为第三颗通过双筒望远镜与长时间曝光摄影可见的彗星。这颗彗星于今年初被发现，目前仍在向太阳系内部行进。它将于11月8日到达近日点，但在此之前，10月21日会率先以约日地距离一半的间距掠过近地点。尽管彗星亮度向来难以精确预测，但乐观估计届时莱蒙彗星或能实现肉眼可见。十月中旬前，该彗星最佳观测时段为黎明前的天空，之后也将现身于傍晚天幕。这幅展现彗星分裂且急速变化的离子尾的特写影像，于上周末在美国德克萨斯州拍摄完成。&#34;
                                 data-link=&#34;https://www.bjp.org.cn/APOD/4028c136999710000199987766220011.shtml&#34;&gt;
                                &lt;img src=&#34;20251009-image02.jpg&#34; alt=&#34;莱蒙彗星逐渐变亮&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20251009-image03.jpg&#34;
                                 data-src=&#34;20251009-image03.jpg&#34; 
                                 data-alt=&#34;桉树上的考拉，大奥特维国家公园，澳大利亚&#34; 
                                 data-desc=&#34;在大奥特维国家公园茂密的桉树林中，考拉如同沉睡的哨兵，守护着澳大利亚的野性灵魂。这些有袋动物常被误称为“考拉熊”，但实际上它们与袋熊的体型更接近，它们结实的无尾身躯、毛茸茸的耳朵和柔软的黑色鼻子很容易辨认。   然而，考拉的未来岌岌可危。栖息地丧失、疾病以及丛林大火等气候威胁，使它们正处于关键的十字路口。但森林修复、专门的保护区以及原住民主导的保护工作正在扭转局势。只要持续呵护，这些温顺的攀爬者就能依附在树梢（以及我们的心中），成为澳大利亚野性精神的永恒象征，世世代代传承下去。&#34;
                                 data-link=&#34;https://cn.bing.com/search?q=%e8%80%83%e6%8b%89&amp;amp;form=hpcapt&amp;amp;filters=HpDate:%2220250929_1600%22&amp;#43;mgzv3configlist:%22BingQA_Encyclopedia_Layout%22&#34;&gt;
                                &lt;img src=&#34;20251009-image03.jpg&#34; alt=&#34;桉树上的考拉，大奥特维国家公园，澳大利亚&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20251009-image04.jpg&#34;
                                 data-src=&#34;20251009-image04.jpg&#34; 
                                 data-alt=&#34;克拉克山脉，内华达山脉，约塞米蒂国家公园，加利福尼亚州，美国&#34; 
                                 data-desc=&#34;今年是约塞米蒂国家公园遗产的又一个里程碑。约塞米蒂国家公园自1864年以来一直受到保护，以其令人惊叹的壮丽景色和生态意义而闻名。约塞米蒂坐落在内华达山脉的中心地带，占地近1200平方英里，孕育着巨大的花岗岩、奔腾的瀑布和古老的红杉。克拉克山脉是其鲜为人知的瑰宝之一——今天照片中显示的崎岖高海拔山脊。它以约塞米蒂的第一位守护者、自然保护先驱盖伦·克拉克的名字命名。   克拉克山脉静静地守护着约塞米蒂南部的荒野，其山峰被冰川侵蚀，顶部覆盖着高山草甸。这里，微风轻拂白皮松，天空开阔，呼应着公园诞生时的远见卓识。&#34;
                                 data-link=&#34;https://cn.bing.com/search?q=%e7%ba%a6%e5%a1%9e%e7%b1%b3%e8%92%82%e5%9b%bd%e5%ae%b6%e5%85%ac%e5%9b%ad&amp;amp;form=hpcapt&amp;amp;filters=HpDate:%2220250930_1600%22&amp;#43;mgzv3configlist:%22BingQA_Encyclopedia_Layout%22&#34;&gt;
                                &lt;img src=&#34;20251009-image04.jpg&#34; alt=&#34;克拉克山脉，内华达山脉，约塞米蒂国家公园，加利福尼亚州，美国&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20251009-image05.jpg&#34;
                                 data-src=&#34;20251009-image05.jpg&#34; 
                                 data-alt=&#34;蛇河上的牛轭湖，大提顿国家公园，怀俄明州，美国&#34; 
                                 data-desc=&#34;除了水，河流还承载着生命、历史和故事。它们是大自然对我们景观的永恒贡献，流淌过大地，跨越时间。蜿蜒流经怀俄明州大提顿国家公园的蛇河便是其中一颗瑰宝。这条河上一个尤为令人惊叹的景点是牛轭湖湾——今天这张照片中就出现了——平静的水面倒映着巍峨的提顿山脉，驼鹿和白头鹰等野生动物在这里繁衍生息。在这里，河水自由流淌，不受混凝土或商业的束缚，受到1968年今天签署的《野生与风景河流法案》的保护。   这项具有里程碑意义的法律是一项承诺：有些河流将永远奔腾不息。它守护着那些拥有“非凡之美”的水域，守护着生态和精神——歌唱着荒野，低语着遗产的河流。蛇河源头，包括牛轭湾，于2009年被列入这份神圣名单，确保其倒影不受干扰，韵律不被打破。   黎明时分，薄雾在河湾处舞动，群山沐浴在晨曦的余晖中。游客驻足，静静地欣赏着大自然的诗意。多亏了这项法案，这条河的故事得以流淌——未受驯服，未受污染，令人难忘。&#34;
                                 data-link=&#34;https://cn.bing.com/search?q=%e5%9b%bd%e5%ae%b6%e9%a3%8e%e6%99%af%e4%b8%8e%e8%87%aa%e7%84%b6%e6%b2%b3%e6%b5%81%e4%bd%93%e7%b3%bb&amp;amp;form=hpcapt&amp;amp;filters=HpDate:%2220251001_1600%22&amp;#43;mgzv3configlist:%22BingQA_Encyclopedia_Layout%22&#34;&gt;
                                &lt;img src=&#34;20251009-image05.jpg&#34; alt=&#34;蛇河上的牛轭湖，大提顿国家公园，怀俄明州，美国&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20251009-image06.jpg&#34;
                                 data-src=&#34;20251009-image06.jpg&#34; 
                                 data-alt=&#34;布里特尔峡谷里生长的帚石楠花，斯凯岛，苏格兰&#34; 
                                 data-desc=&#34;雾气袅袅，水波粼粼，传说萦绕——欢迎来到格伦·布里特尔。在苏格兰传说中的“雾岛”斯凯岛上，峡谷绵延展开，紫色石楠花如地毯般铺满崎岖山坡。这片土地回荡着历史的低语：远在八千年前新石器时代猎人循溪而行之前，恐龙的足迹早已镌刻于峭壁之上。九世纪时，航海的北欧维京人在此定居。数百年后，强大的麦克劳德与麦克唐纳氏族相继占据这片疆土，他们的城堡见证了无数战役与同盟的兴衰。   在群山与隐秘湖泊之间，仙女池闪烁着翡翠与绿松石般的光泽，水流在火山岩上翻滚奔涌——据当地传说，这里曾是仙女们在月光下翩跹起舞之地。不远处，被称为“水之釜”的科鲁伊斯克湖隐匿于锯齿状的黑色库林山峰之下，相传湖中有水怪出没，是一种能变幻形貌的水灵。红鹿在石楠丛中悄然滑行，野兔沿着隐秘小径消失不见，金雕在高空盘旋。布里特尔峡谷正是地质奇观、野生动物与人类历史交织之地。每块岩石、每道瀑布、每座山谷都在诉说故事——请轻步慢行，侧耳倾听。&#34;
                                 data-link=&#34;https://cn.bing.com/search?q=%e6%96%af%e5%87%af%e5%b2%9b&amp;amp;form=hpcapt&amp;amp;filters=HpDate:%2220251002_1600%22&amp;#43;mgzv3configlist:%22BingQA_Encyclopedia_Layout%22&#34;&gt;
                                &lt;img src=&#34;20251009-image06.jpg&#34; alt=&#34;布里特尔峡谷里生长的帚石楠花，斯凯岛，苏格兰&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20251009-image07.jpg&#34;
                                 data-src=&#34;20251009-image07.jpg&#34; 
                                 data-alt=&#34;从SpaceX载人龙飞船“奋进号”视角看到的国际空间站主太阳能电池阵列&#34; 
                                 data-desc=&#34;10月4日至10日，世界空间周邀我们一同超越地球的界限，追逐星辰。这一盛事源于1957年苏联发射的\&amp;#34;斯普特尼克1号\&amp;#34;卫星，以及1967年签署的《外层空间条约》——这份开创性的国际承诺标志着人类和平探索宇宙的崭新篇章。在这一周里，教室里充满实验的热闹，天文馆里惊叹声不绝于耳，望远镜将人类与遥远星系相连。这些瞬间共同编织出科学探索的宇宙篇章，见证人类不断突破边界的执着追求。本年度主题明确：点燃新一代探索者、工程师和梦想家的热情，让他们准备好改写宇宙的篇章。   今天这张照片展示了国际空间站（ISS）的壮观景象，这座由16个国家共同建造的巨型实验室，正环绕地球约250英里的轨道运行。其太阳能电池板持续吸收阳光，为微重力环境研究、前沿科技探索以及人类在地球之外的生存实验提供动力。这张照片由SpaceX载人龙飞船“奋进号”拍摄——这艘可重复使用的航天器自2020年以来已完成六次任务，负责运送宇航员和货物。这一场景生动诠释了人类选择合作而非竞争时所能取得的成就。每一块闪闪发光的太阳能板都在昭示：最后的疆域触手可及，而探索它的无畏气魄，正是人类的本质。&#34;
                                 data-link=&#34;https://cn.bing.com/search?q=%e4%b8%96%e7%95%8c%e7%a9%ba%e9%97%b4%e5%91%a8&amp;amp;form=hpcapt&amp;amp;filters=HpDate:%2220251003_1600%22&amp;#43;mgzv3configlist:%22BingQA_Encyclopedia_Layout%22&#34;&gt;
                                &lt;img src=&#34;20251009-image07.jpg&#34; alt=&#34;从SpaceX载人龙飞船“奋进号”视角看到的国际空间站主太阳能电池阵列&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20251009-image08.jpg&#34;
                                 data-src=&#34;20251009-image08.jpg&#34; 
                                 data-alt=&#34;中欧森林里的鬼鸮&#34; 
                                 data-desc=&#34;教书育人的传统在整个人类历史中根深蒂固。今天，我们向那些倾注心血传播知识、塑造思想的教育者致敬。祝所有老师世界教师节快乐，感谢你们帮助我们成为更好的自己。   从中国古代的孔子，到古希腊的苏格拉底、柏拉图和亚里士多德，再到20世纪意大利的玛丽亚·蒙特梭利，教师不仅塑造了无数人的人生，也深刻影响了人类历史。许多文化名人曾站在讲台前授课——你知道吗？畅销书作家斯蒂芬·金在成名之前就是一名英语教师。   教师是社会繁荣发展的基石。正因为此，联合国教科文组织与国际劳工组织于1994年将每年的10月5日定为“世界教师日”，以表彰并支持全球教育工作者。为致敬智慧，今天选用北方鸮作为象征。猫头鹰自古便代表着智慧与洞察力，最早的关联可追溯至希腊神话：智慧女神雅典娜常与一只小猫头鹰相伴，这种神圣的动物成为其象征。这只夜行伙伴逐渐成为“看得更深、更透”的象征，代表着清晰的思维与敏锐的洞察。&#34;
                                 data-link=&#34;https://cn.bing.com/search?q=%e4%b8%96%e7%95%8c%e6%95%99%e5%b8%88%e6%97%a5&amp;amp;form=hpcapt&amp;amp;filters=HpDate:%2220251004_1600%22&amp;#43;mgzv3configlist:%22BingQA_Encyclopedia_Layout%22&#34;&gt;
                                &lt;img src=&#34;20251009-image08.jpg&#34; alt=&#34;中欧森林里的鬼鸮&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20251009-image09.jpg&#34;
                                 data-src=&#34;20251009-image09.jpg&#34; 
                                 data-alt=&#34;安顺桥中秋灯展，成都，中国&#34; 
                                 data-desc=&#34;当秋月当空，空气中已透出冬日的气息，那份战栗感总会在记忆中久久萦绕。中秋节——亦称月节——作为中国最珍视的节日之一，为丰收时节的尾声增添了又一抹神话色彩。它在农历八月十五日庆祝，今年恰逢10月6日。相传此夜，月神嫦娥正俯瞰人间。   家人团聚共享月饼——这种圆形糕点内馅或甜或咸，滋味美妙。与亲朋相聚欣赏灯笼、赏月，享受真挚的团圆时光。中秋时节的安顺桥被灯笼点亮，它沐浴在光芒中，为节日增添华彩。今夜，让我们举杯庆祝，一起享受这个美好的节日吧！祝愿大家，花好月圆，喜乐平安！&#34;
                                 data-link=&#34;https://cn.bing.com/search?q=%e4%b8%ad%e7%a7%8b%e8%8a%82&amp;amp;form=hpcapt&amp;amp;filters=HpDate:%2220251005_1600%22&amp;#43;mgzv3configlist:%22BingQA_Encyclopedia_Layout%22&#34;&gt;
                                &lt;img src=&#34;20251009-image09.jpg&#34; alt=&#34;安顺桥中秋灯展，成都，中国&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20251009-image10.jpg&#34;
                                 data-src=&#34;20251009-image10.jpg&#34; 
                                 data-alt=&#34;里奇韦附近斯内弗尔斯山脚下的秋色，科罗拉多州，美国&#34; 
                                 data-desc=&#34;又到了一年之中，山峦褪去夏日青翠，披上绚烂秋色的时节。变色通常始于九月初至十月初，高处山坡率先染上秋意，随后低处山谷渐次跟进。白杨树堪称这场视觉盛宴的主角，其叶片在阳光下闪烁，宛如金币般熠熠生辉。然而白杨的绚烂并非年年如约而至。它们的色彩取决于多重因素——树木健康状况、局部气候变化、土壤湿度，以及生长海拔与纬度。健康的白杨林才是真正的季节主角：枝繁叶茂的林群色彩更明亮，落叶也更晚；而受压或衰弱的树木往往迅速褪色，只留下一抹短暂的辉煌。去年令人惊艳的景致，今年或许黯淡无光。今日镜头捕捉到斯内弗尔斯山麓的绚烂盛景——这座科罗拉多州斯内弗尔斯山脉的最高峰，从里奇韦镇拔地而起，海拔拔高逾7000英尺。&#34;
                                 data-link=&#34;https://cn.bing.com/search?q=%e7%a7%91%e7%bd%97%e6%8b%89%e5%a4%9a%e5%b7%9e&amp;amp;form=hpcapt&amp;amp;filters=HpDate:%2220251006_1600%22&amp;#43;mgzv3configlist:%22BingQA_Encyclopedia_Layout%22&#34;&gt;
                                &lt;img src=&#34;20251009-image10.jpg&#34; alt=&#34;里奇韦附近斯内弗尔斯山脚下的秋色，科罗拉多州，美国&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20251009-image11.jpg&#34;
                                 data-src=&#34;20251009-image11.jpg&#34; 
                                 data-alt=&#34;白日章鱼，毛伊岛，夏威夷，美国&#34; 
                                 data-desc=&#34;八只触手，魅力十足，今天的主角是章鱼！值此世界章鱼日，当我们赞叹它们的智慧时，更要意识到：即便是这些海洋天才，也无法逃避气候变化和污染威胁。守护它们的家园，就是守护海洋的未来。   来认识一下伪装大师——白日章鱼。这种栖息于珊瑚礁的生物遍布太平洋和印度洋，从夏威夷到非洲东海岸皆有踪迹，堪称真正的“变形高手”。与大多数同类不同，它在白天狩猎，能瞬间改变体色、花纹乃至皮肤质地，完美融入环境。有时它还会上演精妙的\&amp;#34;浮云幻影\&amp;#34;戏码，投射虚假阴影诱使螃蟹在致命时刻移动。一旦猎物上钩，它便迅速出击。这位高超的猎手在珊瑚礁间游走，捕食鱼类、螃蟹、虾和软体动物。小猎物当场吞食，大猎物则拖回巢穴慢慢享用。&#34;
                                 data-link=&#34;https://cn.bing.com/search?q=%e4%b8%96%e7%95%8c%e7%ab%a0%e9%b1%bc%e6%97%a5&amp;amp;form=hpcapt&amp;amp;filters=HpDate:%2220251007_1600%22&amp;#43;mgzv3configlist:%22BingQA_Encyclopedia_Layout%22&#34;&gt;
                                &lt;img src=&#34;20251009-image11.jpg&#34; alt=&#34;白日章鱼，毛伊岛，夏威夷，美国&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20251009-image12.jpg&#34;
                                 data-src=&#34;20251009-image12.jpg&#34; 
                                 data-alt=&#34;‌詹姆斯·韦伯太空望远镜观测的创生之柱&#34; 
                                 data-desc=&#34;随着世界空间周接近尾声，宇宙依然不断给予我们仰望的理由。想象一下云朵——不是在天空中飘动，而是在浩瀚星海中延展，孕育着新星的诞生。这正是NASA的詹姆斯·韦布太空望远镜所捕捉到的“创生之柱”景象。如图所示，色彩与细节前所未见，令人震撼。   这些巨大的尖塔状结构，从左下角斜伸至右上角，几乎完全由尘埃和气体构成，这里正是恒星诞生的摇篮。在这些巍峨的结构内部，引力紧紧束缚着团块状的物质，逐步引发燃烧，从而孕育出新的恒星，它们已在柱体边缘闪烁生辉。令人惊叹的是，这一宇宙奇观正发生在距我们仅6500光年的鹰状星云中。这些柱体隐藏在遮蔽遥远宇宙的厚重星际云带之后，却依然绽放着璀璨的光芒，成为星云的焦点所在。&#34;
                                 data-link=&#34;https://cn.bing.com/search?q=%e5%88%9b%e7%94%9f%e4%b9%8b%e6%9f%b1&amp;amp;form=hpcapt&amp;amp;filters=HpDate:%2220251008_1600%22&amp;#43;mgzv3configlist:%22BingQA_Encyclopedia_Layout%22&#34;&gt;
                                &lt;img src=&#34;20251009-image12.jpg&#34; alt=&#34;‌詹姆斯·韦伯太空望远镜观测的创生之柱&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                    
                &lt;/div&gt;
            &lt;/div&gt;

            &lt;button class=&#34;nav-btn prev-btn&#34; aria-label=&#34;Previous&#34;&gt;
                &lt;svg width=&#34;24&#34; height=&#34;24&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;polyline points=&#34;15 18 9 12 15 6&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
            &lt;button class=&#34;nav-btn next-btn&#34; aria-label=&#34;Next&#34;&gt;
                &lt;svg width=&#34;24&#34; height=&#34;24&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;polyline points=&#34;9 18 15 12 9 6&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
            
            &lt;div class=&#34;inline-counter&#34;&gt;1 / 1&lt;/div&gt;
        &lt;/div&gt;

        &lt;div class=&#34;info-column&#34;&gt;
            &lt;div class=&#34;info-content-top&#34;&gt;
                &lt;div class=&#34;info-header&#34;&gt;
                    &lt;h3 class=&#34;gallery-title&#34;&gt;&lt;/h3&gt;
                &lt;/div&gt;
                
                &lt;div class=&#34;info-card&#34;&gt;
                    &lt;div class=&#34;info-body&#34;&gt;
                        &lt;p class=&#34;gallery-desc&#34;&gt;&lt;/p&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
            &lt;/div&gt;

            &lt;div class=&#34;info-footer&#34;&gt;
                &lt;div class=&#34;gallery-thumbs&#34;&gt;&lt;/div&gt;
            &lt;/div&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;gallery-lightbox&#34;&gt;
        &lt;div class=&#34;lb-toolbar&#34;&gt;
            &lt;span class=&#34;lb-counter&#34;&gt;&lt;/span&gt;
            &lt;div class=&#34;lb-actions&#34;&gt;
                &lt;a class=&#34;lb-btn lb-link-btn&#34; href=&#34;#&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; title=&#34;打开链接/原图&#34;&gt;
                    &lt;svg width=&#34;20&#34; height=&#34;20&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
                &lt;/a&gt;
                &lt;button class=&#34;lb-btn lb-close-btn&#34; title=&#34;关闭&#34;&gt;
                    &lt;svg width=&#34;24&#34; height=&#34;24&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34;&gt;&lt;line x1=&#34;18&#34; y1=&#34;6&#34; x2=&#34;6&#34; y2=&#34;18&#34;&gt;&lt;/line&gt;&lt;line x1=&#34;6&#34; y1=&#34;6&#34; x2=&#34;18&#34; y2=&#34;18&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
                &lt;/button&gt;
            &lt;/div&gt;
        &lt;/div&gt;
        &lt;div class=&#34;lb-canvas&#34;&gt;
            &lt;button class=&#34;lb-nav lb-prev&#34;&gt;
                &lt;svg width=&#34;36&#34; height=&#34;36&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34;&gt;&lt;polyline points=&#34;15 18 9 12 15 6&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
            &lt;div class=&#34;lb-img-wrapper&#34;&gt;
                &lt;img class=&#34;lb-img&#34; src=&#34;&#34; alt=&#34;&#34;&gt;
            &lt;/div&gt;
            &lt;button class=&#34;lb-nav lb-next&#34;&gt;
                &lt;svg width=&#34;36&#34; height=&#34;36&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34;&gt;&lt;polyline points=&#34;9 18 15 12 9 6&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

&lt;style&gt;
     
    .hugo-gallery {
        --g-bg: #ffffff;
        --g-border: #e0e0e0;
        --g-visual-bg: #111;
        --g-text-main: inherit; 
        --g-text-sub: #555;
        --g-card-bg: #f7f9fc;
        --g-card-border: #3b82f6;
        --g-thumb-active: #3b82f6;

        position: relative;
        margin: 2em 0;
        background: var(--g-bg);
        border: 1px solid var(--g-border);
        font-family: inherit; 
        box-sizing: border-box;
    }
    .hugo-gallery * { box-sizing: border-box; }

     
    [data-scheme=&#34;dark&#34;] .hugo-gallery,
    html[data-theme=&#34;dark&#34;] .hugo-gallery,
    body.dark .hugo-gallery {
        --g-bg: #1e1e1e;
        --g-border: #333;
        --g-visual-bg: #000;
        --g-text-sub: #aaa;
        --g-card-bg: #252526;
        --g-card-border: #60a5fa;
        --g-thumb-active: #60a5fa;
    }
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .hugo-gallery {
            --g-bg: #1e1e1e;
            --g-border: #333;
            --g-visual-bg: #000;
            --g-text-sub: #aaa;
            --g-card-bg: #252526;
            --g-card-border: #60a5fa;
            --g-thumb-active: #60a5fa;
        }
    }

     
    .gallery-inline-layout {
        display: grid;
        grid-template-columns: 2fr 1.2fr; 
        height: 550px; 
    }

     
    .visual-column {
        position: relative;
        background: var(--g-visual-bg);
        overflow: hidden;
        display: flex; align-items: center; justify-content: center;
    }
    .gallery-viewport { width: 100%; height: 100%; cursor: zoom-in; }
    .gallery-track { display: flex; height: 100%; transition: transform 0.3s ease; }
    .gallery-slide { 
        flex: 0 0 100%; width: 100%; height: 100%; 
        display: flex; align-items: center; justify-content: center; 
    }
    .gallery-slide img { 
        max-width: 100%; max-height: 100%; 
        object-fit: contain; display: block; 
    }

    .nav-btn {
        position: absolute; top: 50%; transform: translateY(-50%);
        width: 40px; height: 40px;
        background: rgba(255,255,255,0.9);
        border: none; border-radius: 50%; 
        cursor: pointer; color: #000;
        display: flex; align-items: center; justify-content: center;
        opacity: 0; transition: opacity 0.2s; z-index: 10;
    }
    .visual-column:hover .nav-btn { opacity: 1; }
    .prev-btn { left: 15px; }
    .next-btn { right: 15px; }
    .inline-counter {
        position: absolute; top: 15px; right: 15px;
        background: rgba(0,0,0,0.6); color: #fff;
        padding: 4px 8px; border-radius: 4px;
        font-size: 0.85em; pointer-events: none;
    }

     
    .info-column {
        display: flex; flex-direction: column;
        padding: 25px;
        background: var(--g-bg);
        border-left: 1px solid var(--g-border);
        overflow: hidden; 
        color: var(--g-text-main);
        justify-content: flex-start; 
        height: 100%;  
    }
    
    .info-content-top {
         
        flex: 1; 
        display: flex; 
        flex-direction: column;
        min-height: 0;  
        overflow: hidden;  
    }

    .info-header { margin-bottom: 20px; flex-shrink: 0; }
    .gallery-title { margin: 0; line-height: 1.3; color: inherit; }

    .info-card {
         
        flex: 1;
        display: flex; flex-direction: column;
        margin-bottom: 20px; background: var(--g-card-bg);
        border-left: 4px solid var(--g-card-border);
        border-radius: 0 4px 4px 0;
        min-height: 0;  
    }
    .info-body {
         
        flex: 1;
        overflow-y: auto; 
        padding: 15px 20px; 
        scrollbar-width: thin;
    }
    .gallery-desc { 
        margin: 0; color: var(--g-text-sub); 
        line-height: 1.6; white-space: pre-wrap; 
    }
    
     
    .info-footer { 
        flex-shrink: 0; 
        margin-top: auto; 
        padding-top: 20px;
    }
    
    .gallery-thumbs { 
         
        position: relative;
        display: flex; gap: 10px; flex-wrap: wrap; 
        align-items: flex-start;
        max-height: 130px; 
        overflow-y: auto;
        scrollbar-width: thin;
    }
    .hugo-gallery .gallery-thumbs .g-thumb {
        width: 50px !important; height: 50px !important; 
        min-width: 50px !important; min-height: 50px !important;
        flex-shrink: 0; cursor: pointer; opacity: 0.6;
        border: 2px solid transparent; border-radius: 6px; 
        overflow: hidden; position: relative; background: #eee;
        padding: 0 !important; margin: 0 !important;
    }
    .hugo-gallery .gallery-thumbs .g-thumb img { 
        width: 100% !important; height: 100% !important; 
        object-fit: cover !important; display: block !important;
        margin: 0 !important; padding: 0 !important; max-width: none !important;
    }
    .hugo-gallery .gallery-thumbs .g-thumb:hover { opacity: 0.9; }
    .hugo-gallery .gallery-thumbs .g-thumb.active { 
        opacity: 1; border-color: var(--g-thumb-active); 
        box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.2);
    }

     
    @media (max-width: 768px) {
        .gallery-inline-layout { grid-template-columns: 1fr; grid-template-rows: 60vw auto; height: auto; }
        .visual-column { height: 100%; min-height: 250px; }
        .info-column { border-left: none; border-top: 1px solid var(--g-border); height: 400px; padding: 20px; }
        .info-card { background: transparent; border-left: none; padding-left: 0; }
        .info-body { padding: 0; }
        .info-footer { margin-top: auto; }
    }

     
    .gallery-lightbox {
        position: fixed; inset: 0; z-index: 99999;
        background: #000; display: none; flex-direction: column;
        opacity: 0; transition: opacity 0.2s; user-select: none;
    }
    .gallery-lightbox.active { display: flex; opacity: 1; }
    .lb-toolbar {
        position: absolute; top: 0; left: 0; width: 100%; height: 60px;
        display: flex; justify-content: space-between; align-items: center;
        padding: 0 20px; z-index: 20; background: rgba(0,0,0,0.6);
    }
    .lb-counter { color: #ccc; font-size: 0.9em; }
    .lb-actions { display: flex; gap: 15px; }
    .lb-btn { background: transparent; border: none; color: #ddd; cursor: pointer; display: flex; align-items: center; }
    .lb-btn:hover { color: #fff; }
    .lb-canvas {
        flex: 1; width: 100%; height: 100%; position: relative; overflow: hidden;
        display: flex; align-items: center; justify-content: center;
    }
    .lb-img-wrapper { width: 100%; height: 100%; display: flex; align-items: center; justify-content: center; }
    .lb-img { max-width: 100%; max-height: 100%; object-fit: contain; transform-origin: center; will-change: transform; }
    .lb-nav {
        position: absolute; top: 50%; transform: translateY(-50%);
        background: transparent; border: none; color: rgba(255,255,255,0.5);
        padding: 20px; cursor: pointer; z-index: 10;
    }
    .lb-nav:hover { color: #fff; }
    .lb-prev { left: 10px; } .lb-next { right: 10px; }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const galleryId = &#34;gallery-96&#34;;
        const root = document.getElementById(galleryId);
        if (!root) return;

        const track = root.querySelector(&#39;.gallery-track&#39;);
        const slides = Array.from(track.querySelectorAll(&#39;.gallery-slide&#39;));
        if (slides.length === 0) return;

        const titleEl = root.querySelector(&#39;.gallery-title&#39;);
        const descEl = root.querySelector(&#39;.gallery-desc&#39;);
        const counterEl = root.querySelector(&#39;.inline-counter&#39;);
        const thumbsContainer = root.querySelector(&#39;.gallery-thumbs&#39;);
        const infoCard = root.querySelector(&#39;.info-card&#39;);

        const lb = root.querySelector(&#39;.gallery-lightbox&#39;);
        const lbImg = lb.querySelector(&#39;.lb-img&#39;);
        const lbCounter = lb.querySelector(&#39;.lb-counter&#39;);
        const lbLinkBtn = lb.querySelector(&#39;.lb-link-btn&#39;); 
        
        let currentIndex = 0;
        const total = slides.length;
        
        let zoomLevel = 1; let panX = 0, panY = 0; 
        let startX = 0, startY = 0; let initialPanX = 0, initialPanY = 0; 
        let isDragging = false; let hasMoved = false; 
        
        slides.forEach((s, i) =&gt; {
            const thumbSrc = s.dataset.thumb || s.querySelector(&#39;img&#39;).src;
            const t = document.createElement(&#39;div&#39;);
            t.className = i === 0 ? &#39;g-thumb active&#39; : &#39;g-thumb&#39;;
            t.innerHTML = `&lt;img src=&#34;${thumbSrc}&#34; loading=&#34;lazy&#34;&gt;`;
            t.onclick = (e) =&gt; { e.stopPropagation(); switchTo(i); };
            thumbsContainer.appendChild(t);
        });
        const thumbs = thumbsContainer.querySelectorAll(&#39;.g-thumb&#39;);

        
        function safeScrollThumb(container, thumb) {
            if (!container || !thumb) return;
            
            
            const thumbTop = thumb.offsetTop;
            const thumbHeight = thumb.offsetHeight;
            const containerScrollTop = container.scrollTop;
            const containerHeight = container.clientHeight;

            
            if (thumbTop &lt; containerScrollTop) {
                
                container.scrollTop = thumbTop;
            } else if (thumbTop + thumbHeight &gt; containerScrollTop + containerHeight) {
                
                container.scrollTop = thumbTop + thumbHeight - containerHeight;
            }
        }

        function switchTo(index) {
            if (index &lt; 0) index = total - 1;
            if (index &gt;= total) index = 0;
            currentIndex = index;

            track.style.transform = `translateX(${-100 * index}%)`;
            const s = slides[index];
            
            const title = s.dataset.alt || &#34;&#34;;
            const desc = s.dataset.desc || &#34;&#34;;
            
            titleEl.textContent = title;
            descEl.textContent = desc;
            
            titleEl.parentElement.style.display = title ? &#39;block&#39; : &#39;none&#39;;
            if (desc) {
                infoCard.style.display = &#39;flex&#39;;
            } else {
                infoCard.style.display = &#39;none&#39;;
            }
            
            counterEl.textContent = `${index + 1} / ${total}`;

            thumbs.forEach(t =&gt; t.classList.remove(&#39;active&#39;));
            if (thumbs[index]) {
                thumbs[index].classList.add(&#39;active&#39;);
                safeScrollThumb(thumbsContainer, thumbs[index]);
            }

            if (lb.classList.contains(&#39;active&#39;)) {
                updateLightboxImage(index);
            }
        }

        function openLightbox() {
            updateLightboxImage(currentIndex);
            lb.classList.add(&#39;active&#39;);
            document.body.style.overflow = &#39;hidden&#39;; 
        }

        function closeLightbox() {
            lb.classList.remove(&#39;active&#39;);
            document.body.style.overflow = &#39;&#39;;
            setTimeout(resetZoom, 200);
        }

        function updateLightboxImage(index) {
            resetZoom(); 
            lbImg.style.opacity = 0.5;
            const s = slides[index];
            const targetLink = s.dataset.link || s.dataset.src;
            lbLinkBtn.href = targetLink;
            const tempImg = new Image();
            tempImg.src = s.dataset.src;
            tempImg.onload = () =&gt; {
                lbImg.src = s.dataset.src;
                lbImg.style.opacity = 1;
            };
            lbCounter.textContent = `${index + 1} / ${total}`;
        }

        function updateTransform() {
            lbImg.style.transform = `translate(${panX}px, ${panY}px) scale(${zoomLevel})`;
        }

        function resetZoom() {
            zoomLevel = 1; panX = 0; panY = 0;
            lbImg.style.transform = &#39;&#39;;
            lbImg.style.transition = &#39;transform 0.3s ease&#39;; 
        }

        lbImg.addEventListener(&#39;wheel&#39;, (e) =&gt; {
            e.preventDefault();
            const delta = e.deltaY * -0.01;
            zoomLevel = Math.min(Math.max(1, zoomLevel + delta), 5); 
            if (zoomLevel === 1) { panX = 0; panY = 0; }
            lbImg.style.transition = &#39;none&#39;; 
            updateTransform();
        });

        function onDragStart(e) {
            if (zoomLevel &lt;= 1) return; 
            e.preventDefault();
            isDragging = true; hasMoved = false; 
            startX = e.type.includes(&#39;mouse&#39;) ? e.pageX : e.touches[0].pageX;
            startY = e.type.includes(&#39;mouse&#39;) ? e.pageY : e.touches[0].pageY;
            initialPanX = panX; initialPanY = panY;
            lbImg.style.transition = &#39;none&#39;; 
        }

        function onDragMove(e) {
            if (!isDragging) return;
            e.preventDefault();
            const currentX = e.type.includes(&#39;mouse&#39;) ? e.pageX : e.touches[0].pageX;
            const currentY = e.type.includes(&#39;mouse&#39;) ? e.pageY : e.touches[0].pageY;
            const diffX = currentX - startX; const diffY = currentY - startY;
            if (Math.abs(diffX) &gt; 2 || Math.abs(diffY) &gt; 2) hasMoved = true;
            panX = initialPanX + diffX; panY = initialPanY + diffY;
            updateTransform();
        }

        function onDragEnd(e) {
            if (!isDragging) return;
            isDragging = false;
            lbImg.style.transition = &#39;transform 0.1s linear&#39;; 
        }

        lbImg.addEventListener(&#39;click&#39;, (e) =&gt; {
            e.stopPropagation();
            if (hasMoved) { hasMoved = false; return; }
            if (zoomLevel &gt; 1) { resetZoom(); } 
            else { zoomLevel = 2.5; lbImg.style.transition = &#39;transform 0.3s cubic-bezier(0.25, 0.8, 0.25, 1)&#39;; updateTransform(); }
        });

        lbImg.addEventListener(&#39;mousedown&#39;, onDragStart);
        lbImg.addEventListener(&#39;touchstart&#39;, onDragStart);
        window.addEventListener(&#39;mousemove&#39;, onDragMove);
        window.addEventListener(&#39;touchmove&#39;, onDragMove, { passive: false });
        window.addEventListener(&#39;mouseup&#39;, onDragEnd);
        window.addEventListener(&#39;touchend&#39;, onDragEnd);

        root.querySelector(&#39;.gallery-track&#39;).onclick = () =&gt; openLightbox();

        const bindNav = (btn, dir) =&gt; {
            btn.onclick = (e) =&gt; {
                e.preventDefault(); e.stopImmediatePropagation(); 
                switchTo(currentIndex + dir);
            };
        };

        bindNav(root.querySelector(&#39;.prev-btn&#39;), -1);
        bindNav(root.querySelector(&#39;.next-btn&#39;), 1);
        bindNav(lb.querySelector(&#39;.lb-prev&#39;), -1);
        bindNav(lb.querySelector(&#39;.lb-next&#39;), 1);

        lb.querySelector(&#39;.lb-close-btn&#39;).onclick = (e) =&gt; { e.stopPropagation(); closeLightbox(); };
        lbLinkBtn.onclick = (e) =&gt; { e.stopPropagation(); };

        lb.onclick = (e) =&gt; {
            if (e.target === lb || e.target.classList.contains(&#39;lb-canvas&#39;)) closeLightbox();
        };

        document.addEventListener(&#39;keydown&#39;, (e) =&gt; {
            if (!lb.classList.contains(&#39;active&#39;)) return;
            if (e.key === &#39;ArrowLeft&#39;) switchTo(currentIndex - 1);
            if (e.key === &#39;ArrowRight&#39;) switchTo(currentIndex + 1);
            if (e.key === &#39;Escape&#39;) closeLightbox();
        });

        
        switchTo(0);
    })();
&lt;/script&gt;
&lt;div class=&#34;hugo-gallery&#34; id=&#34;gallery-97&#34;&gt;
    &lt;div class=&#34;gallery-inline-layout&#34;&gt;
        
        &lt;div class=&#34;visual-column&#34;&gt;
            &lt;div class=&#34;gallery-viewport&#34;&gt;
                &lt;div class=&#34;gallery-track&#34;&gt;
                    
                        
                        
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20251009-image13.jpg&#34;
                                 data-src=&#34;20251009-image13.jpg&#34; 
                                 data-alt=&#34;思绪。回声。&#34; 
                                 data-desc=&#34;&#34;
                                 data-link=&#34;http://www.cnu.cc/works/672878&#34;&gt;
                                &lt;img src=&#34;20251009-image13.jpg&#34; alt=&#34;思绪。回声。&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20251009-image14.jpg&#34;
                                 data-src=&#34;20251009-image14.jpg&#34; 
                                 data-alt=&#34;思绪。回声。&#34; 
                                 data-desc=&#34;&#34;
                                 data-link=&#34;http://www.cnu.cc/works/672878&#34;&gt;
                                &lt;img src=&#34;20251009-image14.jpg&#34; alt=&#34;思绪。回声。&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20251009-image15.jpg&#34;
                                 data-src=&#34;20251009-image15.jpg&#34; 
                                 data-alt=&#34;思绪。回声。&#34; 
                                 data-desc=&#34;&#34;
                                 data-link=&#34;http://www.cnu.cc/works/672878&#34;&gt;
                                &lt;img src=&#34;20251009-image15.jpg&#34; alt=&#34;思绪。回声。&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20251009-image16.jpg&#34;
                                 data-src=&#34;20251009-image16.jpg&#34; 
                                 data-alt=&#34;思绪。回声。&#34; 
                                 data-desc=&#34;&#34;
                                 data-link=&#34;http://www.cnu.cc/works/672878&#34;&gt;
                                &lt;img src=&#34;20251009-image16.jpg&#34; alt=&#34;思绪。回声。&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                    
                &lt;/div&gt;
            &lt;/div&gt;

            &lt;button class=&#34;nav-btn prev-btn&#34; aria-label=&#34;Previous&#34;&gt;
                &lt;svg width=&#34;24&#34; height=&#34;24&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;polyline points=&#34;15 18 9 12 15 6&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
            &lt;button class=&#34;nav-btn next-btn&#34; aria-label=&#34;Next&#34;&gt;
                &lt;svg width=&#34;24&#34; height=&#34;24&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;polyline points=&#34;9 18 15 12 9 6&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
            
            &lt;div class=&#34;inline-counter&#34;&gt;1 / 1&lt;/div&gt;
        &lt;/div&gt;

        &lt;div class=&#34;info-column&#34;&gt;
            &lt;div class=&#34;info-content-top&#34;&gt;
                &lt;div class=&#34;info-header&#34;&gt;
                    &lt;h3 class=&#34;gallery-title&#34;&gt;&lt;/h3&gt;
                &lt;/div&gt;
                
                &lt;div class=&#34;info-card&#34;&gt;
                    &lt;div class=&#34;info-body&#34;&gt;
                        &lt;p class=&#34;gallery-desc&#34;&gt;&lt;/p&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
            &lt;/div&gt;

            &lt;div class=&#34;info-footer&#34;&gt;
                &lt;div class=&#34;gallery-thumbs&#34;&gt;&lt;/div&gt;
            &lt;/div&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;gallery-lightbox&#34;&gt;
        &lt;div class=&#34;lb-toolbar&#34;&gt;
            &lt;span class=&#34;lb-counter&#34;&gt;&lt;/span&gt;
            &lt;div class=&#34;lb-actions&#34;&gt;
                &lt;a class=&#34;lb-btn lb-link-btn&#34; href=&#34;#&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; title=&#34;打开链接/原图&#34;&gt;
                    &lt;svg width=&#34;20&#34; height=&#34;20&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
                &lt;/a&gt;
                &lt;button class=&#34;lb-btn lb-close-btn&#34; title=&#34;关闭&#34;&gt;
                    &lt;svg width=&#34;24&#34; height=&#34;24&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34;&gt;&lt;line x1=&#34;18&#34; y1=&#34;6&#34; x2=&#34;6&#34; y2=&#34;18&#34;&gt;&lt;/line&gt;&lt;line x1=&#34;6&#34; y1=&#34;6&#34; x2=&#34;18&#34; y2=&#34;18&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
                &lt;/button&gt;
            &lt;/div&gt;
        &lt;/div&gt;
        &lt;div class=&#34;lb-canvas&#34;&gt;
            &lt;button class=&#34;lb-nav lb-prev&#34;&gt;
                &lt;svg width=&#34;36&#34; height=&#34;36&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34;&gt;&lt;polyline points=&#34;15 18 9 12 15 6&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
            &lt;div class=&#34;lb-img-wrapper&#34;&gt;
                &lt;img class=&#34;lb-img&#34; src=&#34;&#34; alt=&#34;&#34;&gt;
            &lt;/div&gt;
            &lt;button class=&#34;lb-nav lb-next&#34;&gt;
                &lt;svg width=&#34;36&#34; height=&#34;36&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34;&gt;&lt;polyline points=&#34;9 18 15 12 9 6&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

&lt;style&gt;
     
    .hugo-gallery {
        --g-bg: #ffffff;
        --g-border: #e0e0e0;
        --g-visual-bg: #111;
        --g-text-main: inherit; 
        --g-text-sub: #555;
        --g-card-bg: #f7f9fc;
        --g-card-border: #3b82f6;
        --g-thumb-active: #3b82f6;

        position: relative;
        margin: 2em 0;
        background: var(--g-bg);
        border: 1px solid var(--g-border);
        font-family: inherit; 
        box-sizing: border-box;
    }
    .hugo-gallery * { box-sizing: border-box; }

     
    [data-scheme=&#34;dark&#34;] .hugo-gallery,
    html[data-theme=&#34;dark&#34;] .hugo-gallery,
    body.dark .hugo-gallery {
        --g-bg: #1e1e1e;
        --g-border: #333;
        --g-visual-bg: #000;
        --g-text-sub: #aaa;
        --g-card-bg: #252526;
        --g-card-border: #60a5fa;
        --g-thumb-active: #60a5fa;
    }
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .hugo-gallery {
            --g-bg: #1e1e1e;
            --g-border: #333;
            --g-visual-bg: #000;
            --g-text-sub: #aaa;
            --g-card-bg: #252526;
            --g-card-border: #60a5fa;
            --g-thumb-active: #60a5fa;
        }
    }

     
    .gallery-inline-layout {
        display: grid;
        grid-template-columns: 2fr 1.2fr; 
        height: 550px; 
    }

     
    .visual-column {
        position: relative;
        background: var(--g-visual-bg);
        overflow: hidden;
        display: flex; align-items: center; justify-content: center;
    }
    .gallery-viewport { width: 100%; height: 100%; cursor: zoom-in; }
    .gallery-track { display: flex; height: 100%; transition: transform 0.3s ease; }
    .gallery-slide { 
        flex: 0 0 100%; width: 100%; height: 100%; 
        display: flex; align-items: center; justify-content: center; 
    }
    .gallery-slide img { 
        max-width: 100%; max-height: 100%; 
        object-fit: contain; display: block; 
    }

    .nav-btn {
        position: absolute; top: 50%; transform: translateY(-50%);
        width: 40px; height: 40px;
        background: rgba(255,255,255,0.9);
        border: none; border-radius: 50%; 
        cursor: pointer; color: #000;
        display: flex; align-items: center; justify-content: center;
        opacity: 0; transition: opacity 0.2s; z-index: 10;
    }
    .visual-column:hover .nav-btn { opacity: 1; }
    .prev-btn { left: 15px; }
    .next-btn { right: 15px; }
    .inline-counter {
        position: absolute; top: 15px; right: 15px;
        background: rgba(0,0,0,0.6); color: #fff;
        padding: 4px 8px; border-radius: 4px;
        font-size: 0.85em; pointer-events: none;
    }

     
    .info-column {
        display: flex; flex-direction: column;
        padding: 25px;
        background: var(--g-bg);
        border-left: 1px solid var(--g-border);
        overflow: hidden; 
        color: var(--g-text-main);
        justify-content: flex-start; 
        height: 100%;  
    }
    
    .info-content-top {
         
        flex: 1; 
        display: flex; 
        flex-direction: column;
        min-height: 0;  
        overflow: hidden;  
    }

    .info-header { margin-bottom: 20px; flex-shrink: 0; }
    .gallery-title { margin: 0; line-height: 1.3; color: inherit; }

    .info-card {
         
        flex: 1;
        display: flex; flex-direction: column;
        margin-bottom: 20px; background: var(--g-card-bg);
        border-left: 4px solid var(--g-card-border);
        border-radius: 0 4px 4px 0;
        min-height: 0;  
    }
    .info-body {
         
        flex: 1;
        overflow-y: auto; 
        padding: 15px 20px; 
        scrollbar-width: thin;
    }
    .gallery-desc { 
        margin: 0; color: var(--g-text-sub); 
        line-height: 1.6; white-space: pre-wrap; 
    }
    
     
    .info-footer { 
        flex-shrink: 0; 
        margin-top: auto; 
        padding-top: 20px;
    }
    
    .gallery-thumbs { 
         
        position: relative;
        display: flex; gap: 10px; flex-wrap: wrap; 
        align-items: flex-start;
        max-height: 130px; 
        overflow-y: auto;
        scrollbar-width: thin;
    }
    .hugo-gallery .gallery-thumbs .g-thumb {
        width: 50px !important; height: 50px !important; 
        min-width: 50px !important; min-height: 50px !important;
        flex-shrink: 0; cursor: pointer; opacity: 0.6;
        border: 2px solid transparent; border-radius: 6px; 
        overflow: hidden; position: relative; background: #eee;
        padding: 0 !important; margin: 0 !important;
    }
    .hugo-gallery .gallery-thumbs .g-thumb img { 
        width: 100% !important; height: 100% !important; 
        object-fit: cover !important; display: block !important;
        margin: 0 !important; padding: 0 !important; max-width: none !important;
    }
    .hugo-gallery .gallery-thumbs .g-thumb:hover { opacity: 0.9; }
    .hugo-gallery .gallery-thumbs .g-thumb.active { 
        opacity: 1; border-color: var(--g-thumb-active); 
        box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.2);
    }

     
    @media (max-width: 768px) {
        .gallery-inline-layout { grid-template-columns: 1fr; grid-template-rows: 60vw auto; height: auto; }
        .visual-column { height: 100%; min-height: 250px; }
        .info-column { border-left: none; border-top: 1px solid var(--g-border); height: 400px; padding: 20px; }
        .info-card { background: transparent; border-left: none; padding-left: 0; }
        .info-body { padding: 0; }
        .info-footer { margin-top: auto; }
    }

     
    .gallery-lightbox {
        position: fixed; inset: 0; z-index: 99999;
        background: #000; display: none; flex-direction: column;
        opacity: 0; transition: opacity 0.2s; user-select: none;
    }
    .gallery-lightbox.active { display: flex; opacity: 1; }
    .lb-toolbar {
        position: absolute; top: 0; left: 0; width: 100%; height: 60px;
        display: flex; justify-content: space-between; align-items: center;
        padding: 0 20px; z-index: 20; background: rgba(0,0,0,0.6);
    }
    .lb-counter { color: #ccc; font-size: 0.9em; }
    .lb-actions { display: flex; gap: 15px; }
    .lb-btn { background: transparent; border: none; color: #ddd; cursor: pointer; display: flex; align-items: center; }
    .lb-btn:hover { color: #fff; }
    .lb-canvas {
        flex: 1; width: 100%; height: 100%; position: relative; overflow: hidden;
        display: flex; align-items: center; justify-content: center;
    }
    .lb-img-wrapper { width: 100%; height: 100%; display: flex; align-items: center; justify-content: center; }
    .lb-img { max-width: 100%; max-height: 100%; object-fit: contain; transform-origin: center; will-change: transform; }
    .lb-nav {
        position: absolute; top: 50%; transform: translateY(-50%);
        background: transparent; border: none; color: rgba(255,255,255,0.5);
        padding: 20px; cursor: pointer; z-index: 10;
    }
    .lb-nav:hover { color: #fff; }
    .lb-prev { left: 10px; } .lb-next { right: 10px; }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const galleryId = &#34;gallery-97&#34;;
        const root = document.getElementById(galleryId);
        if (!root) return;

        const track = root.querySelector(&#39;.gallery-track&#39;);
        const slides = Array.from(track.querySelectorAll(&#39;.gallery-slide&#39;));
        if (slides.length === 0) return;

        const titleEl = root.querySelector(&#39;.gallery-title&#39;);
        const descEl = root.querySelector(&#39;.gallery-desc&#39;);
        const counterEl = root.querySelector(&#39;.inline-counter&#39;);
        const thumbsContainer = root.querySelector(&#39;.gallery-thumbs&#39;);
        const infoCard = root.querySelector(&#39;.info-card&#39;);

        const lb = root.querySelector(&#39;.gallery-lightbox&#39;);
        const lbImg = lb.querySelector(&#39;.lb-img&#39;);
        const lbCounter = lb.querySelector(&#39;.lb-counter&#39;);
        const lbLinkBtn = lb.querySelector(&#39;.lb-link-btn&#39;); 
        
        let currentIndex = 0;
        const total = slides.length;
        
        let zoomLevel = 1; let panX = 0, panY = 0; 
        let startX = 0, startY = 0; let initialPanX = 0, initialPanY = 0; 
        let isDragging = false; let hasMoved = false; 
        
        slides.forEach((s, i) =&gt; {
            const thumbSrc = s.dataset.thumb || s.querySelector(&#39;img&#39;).src;
            const t = document.createElement(&#39;div&#39;);
            t.className = i === 0 ? &#39;g-thumb active&#39; : &#39;g-thumb&#39;;
            t.innerHTML = `&lt;img src=&#34;${thumbSrc}&#34; loading=&#34;lazy&#34;&gt;`;
            t.onclick = (e) =&gt; { e.stopPropagation(); switchTo(i); };
            thumbsContainer.appendChild(t);
        });
        const thumbs = thumbsContainer.querySelectorAll(&#39;.g-thumb&#39;);

        
        function safeScrollThumb(container, thumb) {
            if (!container || !thumb) return;
            
            
            const thumbTop = thumb.offsetTop;
            const thumbHeight = thumb.offsetHeight;
            const containerScrollTop = container.scrollTop;
            const containerHeight = container.clientHeight;

            
            if (thumbTop &lt; containerScrollTop) {
                
                container.scrollTop = thumbTop;
            } else if (thumbTop + thumbHeight &gt; containerScrollTop + containerHeight) {
                
                container.scrollTop = thumbTop + thumbHeight - containerHeight;
            }
        }

        function switchTo(index) {
            if (index &lt; 0) index = total - 1;
            if (index &gt;= total) index = 0;
            currentIndex = index;

            track.style.transform = `translateX(${-100 * index}%)`;
            const s = slides[index];
            
            const title = s.dataset.alt || &#34;&#34;;
            const desc = s.dataset.desc || &#34;&#34;;
            
            titleEl.textContent = title;
            descEl.textContent = desc;
            
            titleEl.parentElement.style.display = title ? &#39;block&#39; : &#39;none&#39;;
            if (desc) {
                infoCard.style.display = &#39;flex&#39;;
            } else {
                infoCard.style.display = &#39;none&#39;;
            }
            
            counterEl.textContent = `${index + 1} / ${total}`;

            thumbs.forEach(t =&gt; t.classList.remove(&#39;active&#39;));
            if (thumbs[index]) {
                thumbs[index].classList.add(&#39;active&#39;);
                safeScrollThumb(thumbsContainer, thumbs[index]);
            }

            if (lb.classList.contains(&#39;active&#39;)) {
                updateLightboxImage(index);
            }
        }

        function openLightbox() {
            updateLightboxImage(currentIndex);
            lb.classList.add(&#39;active&#39;);
            document.body.style.overflow = &#39;hidden&#39;; 
        }

        function closeLightbox() {
            lb.classList.remove(&#39;active&#39;);
            document.body.style.overflow = &#39;&#39;;
            setTimeout(resetZoom, 200);
        }

        function updateLightboxImage(index) {
            resetZoom(); 
            lbImg.style.opacity = 0.5;
            const s = slides[index];
            const targetLink = s.dataset.link || s.dataset.src;
            lbLinkBtn.href = targetLink;
            const tempImg = new Image();
            tempImg.src = s.dataset.src;
            tempImg.onload = () =&gt; {
                lbImg.src = s.dataset.src;
                lbImg.style.opacity = 1;
            };
            lbCounter.textContent = `${index + 1} / ${total}`;
        }

        function updateTransform() {
            lbImg.style.transform = `translate(${panX}px, ${panY}px) scale(${zoomLevel})`;
        }

        function resetZoom() {
            zoomLevel = 1; panX = 0; panY = 0;
            lbImg.style.transform = &#39;&#39;;
            lbImg.style.transition = &#39;transform 0.3s ease&#39;; 
        }

        lbImg.addEventListener(&#39;wheel&#39;, (e) =&gt; {
            e.preventDefault();
            const delta = e.deltaY * -0.01;
            zoomLevel = Math.min(Math.max(1, zoomLevel + delta), 5); 
            if (zoomLevel === 1) { panX = 0; panY = 0; }
            lbImg.style.transition = &#39;none&#39;; 
            updateTransform();
        });

        function onDragStart(e) {
            if (zoomLevel &lt;= 1) return; 
            e.preventDefault();
            isDragging = true; hasMoved = false; 
            startX = e.type.includes(&#39;mouse&#39;) ? e.pageX : e.touches[0].pageX;
            startY = e.type.includes(&#39;mouse&#39;) ? e.pageY : e.touches[0].pageY;
            initialPanX = panX; initialPanY = panY;
            lbImg.style.transition = &#39;none&#39;; 
        }

        function onDragMove(e) {
            if (!isDragging) return;
            e.preventDefault();
            const currentX = e.type.includes(&#39;mouse&#39;) ? e.pageX : e.touches[0].pageX;
            const currentY = e.type.includes(&#39;mouse&#39;) ? e.pageY : e.touches[0].pageY;
            const diffX = currentX - startX; const diffY = currentY - startY;
            if (Math.abs(diffX) &gt; 2 || Math.abs(diffY) &gt; 2) hasMoved = true;
            panX = initialPanX + diffX; panY = initialPanY + diffY;
            updateTransform();
        }

        function onDragEnd(e) {
            if (!isDragging) return;
            isDragging = false;
            lbImg.style.transition = &#39;transform 0.1s linear&#39;; 
        }

        lbImg.addEventListener(&#39;click&#39;, (e) =&gt; {
            e.stopPropagation();
            if (hasMoved) { hasMoved = false; return; }
            if (zoomLevel &gt; 1) { resetZoom(); } 
            else { zoomLevel = 2.5; lbImg.style.transition = &#39;transform 0.3s cubic-bezier(0.25, 0.8, 0.25, 1)&#39;; updateTransform(); }
        });

        lbImg.addEventListener(&#39;mousedown&#39;, onDragStart);
        lbImg.addEventListener(&#39;touchstart&#39;, onDragStart);
        window.addEventListener(&#39;mousemove&#39;, onDragMove);
        window.addEventListener(&#39;touchmove&#39;, onDragMove, { passive: false });
        window.addEventListener(&#39;mouseup&#39;, onDragEnd);
        window.addEventListener(&#39;touchend&#39;, onDragEnd);

        root.querySelector(&#39;.gallery-track&#39;).onclick = () =&gt; openLightbox();

        const bindNav = (btn, dir) =&gt; {
            btn.onclick = (e) =&gt; {
                e.preventDefault(); e.stopImmediatePropagation(); 
                switchTo(currentIndex + dir);
            };
        };

        bindNav(root.querySelector(&#39;.prev-btn&#39;), -1);
        bindNav(root.querySelector(&#39;.next-btn&#39;), 1);
        bindNav(lb.querySelector(&#39;.lb-prev&#39;), -1);
        bindNav(lb.querySelector(&#39;.lb-next&#39;), 1);

        lb.querySelector(&#39;.lb-close-btn&#39;).onclick = (e) =&gt; { e.stopPropagation(); closeLightbox(); };
        lbLinkBtn.onclick = (e) =&gt; { e.stopPropagation(); };

        lb.onclick = (e) =&gt; {
            if (e.target === lb || e.target.classList.contains(&#39;lb-canvas&#39;)) closeLightbox();
        };

        document.addEventListener(&#39;keydown&#39;, (e) =&gt; {
            if (!lb.classList.contains(&#39;active&#39;)) return;
            if (e.key === &#39;ArrowLeft&#39;) switchTo(currentIndex - 1);
            if (e.key === &#39;ArrowRight&#39;) switchTo(currentIndex + 1);
            if (e.key === &#39;Escape&#39;) closeLightbox();
        });

        
        switchTo(0);
    })();
&lt;/script&gt;
&lt;div class=&#34;hugo-gallery&#34; id=&#34;gallery-98&#34;&gt;
    &lt;div class=&#34;gallery-inline-layout&#34;&gt;
        
        &lt;div class=&#34;visual-column&#34;&gt;
            &lt;div class=&#34;gallery-viewport&#34;&gt;
                &lt;div class=&#34;gallery-track&#34;&gt;
                    
                        
                        
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20251009-image17.jpg&#34;
                                 data-src=&#34;20251009-image17.jpg&#34; 
                                 data-alt=&#34;孤鸟 摄影师silver halide&#34; 
                                 data-desc=&#34;&#34;
                                 data-link=&#34;http://www.cnu.cc/works/672897&#34;&gt;
                                &lt;img src=&#34;20251009-image17.jpg&#34; alt=&#34;孤鸟 摄影师silver halide&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20251009-image18.jpg&#34;
                                 data-src=&#34;20251009-image18.jpg&#34; 
                                 data-alt=&#34;孤鸟 摄影师silver halide&#34; 
                                 data-desc=&#34;&#34;
                                 data-link=&#34;http://www.cnu.cc/works/672897&#34;&gt;
                                &lt;img src=&#34;20251009-image18.jpg&#34; alt=&#34;孤鸟 摄影师silver halide&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20251009-image19.jpg&#34;
                                 data-src=&#34;20251009-image19.jpg&#34; 
                                 data-alt=&#34;孤鸟 摄影师silver halide&#34; 
                                 data-desc=&#34;&#34;
                                 data-link=&#34;http://www.cnu.cc/works/672897&#34;&gt;
                                &lt;img src=&#34;20251009-image19.jpg&#34; alt=&#34;孤鸟 摄影师silver halide&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20251009-image20.jpg&#34;
                                 data-src=&#34;20251009-image20.jpg&#34; 
                                 data-alt=&#34;孤鸟 摄影师silver halide&#34; 
                                 data-desc=&#34;&#34;
                                 data-link=&#34;http://www.cnu.cc/works/672897&#34;&gt;
                                &lt;img src=&#34;20251009-image20.jpg&#34; alt=&#34;孤鸟 摄影师silver halide&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20251009-image21.jpg&#34;
                                 data-src=&#34;20251009-image21.jpg&#34; 
                                 data-alt=&#34;孤鸟 摄影师silver halide&#34; 
                                 data-desc=&#34;&#34;
                                 data-link=&#34;http://www.cnu.cc/works/672897&#34;&gt;
                                &lt;img src=&#34;20251009-image21.jpg&#34; alt=&#34;孤鸟 摄影师silver halide&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20251009-image22.jpg&#34;
                                 data-src=&#34;20251009-image22.jpg&#34; 
                                 data-alt=&#34;孤鸟 摄影师silver halide&#34; 
                                 data-desc=&#34;&#34;
                                 data-link=&#34;http://www.cnu.cc/works/672897&#34;&gt;
                                &lt;img src=&#34;20251009-image22.jpg&#34; alt=&#34;孤鸟 摄影师silver halide&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20251009-image23.jpg&#34;
                                 data-src=&#34;20251009-image23.jpg&#34; 
                                 data-alt=&#34;孤鸟 摄影师silver halide&#34; 
                                 data-desc=&#34;&#34;
                                 data-link=&#34;http://www.cnu.cc/works/672897&#34;&gt;
                                &lt;img src=&#34;20251009-image23.jpg&#34; alt=&#34;孤鸟 摄影师silver halide&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20251009-image24.jpg&#34;
                                 data-src=&#34;20251009-image24.jpg&#34; 
                                 data-alt=&#34;孤鸟 摄影师silver halide&#34; 
                                 data-desc=&#34;&#34;
                                 data-link=&#34;http://www.cnu.cc/works/672897&#34;&gt;
                                &lt;img src=&#34;20251009-image24.jpg&#34; alt=&#34;孤鸟 摄影师silver halide&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20251009-image25.jpg&#34;
                                 data-src=&#34;20251009-image25.jpg&#34; 
                                 data-alt=&#34;孤鸟 摄影师silver halide&#34; 
                                 data-desc=&#34;&#34;
                                 data-link=&#34;http://www.cnu.cc/works/672897&#34;&gt;
                                &lt;img src=&#34;20251009-image25.jpg&#34; alt=&#34;孤鸟 摄影师silver halide&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                    
                &lt;/div&gt;
            &lt;/div&gt;

            &lt;button class=&#34;nav-btn prev-btn&#34; aria-label=&#34;Previous&#34;&gt;
                &lt;svg width=&#34;24&#34; height=&#34;24&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;polyline points=&#34;15 18 9 12 15 6&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
            &lt;button class=&#34;nav-btn next-btn&#34; aria-label=&#34;Next&#34;&gt;
                &lt;svg width=&#34;24&#34; height=&#34;24&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;polyline points=&#34;9 18 15 12 9 6&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
            
            &lt;div class=&#34;inline-counter&#34;&gt;1 / 1&lt;/div&gt;
        &lt;/div&gt;

        &lt;div class=&#34;info-column&#34;&gt;
            &lt;div class=&#34;info-content-top&#34;&gt;
                &lt;div class=&#34;info-header&#34;&gt;
                    &lt;h3 class=&#34;gallery-title&#34;&gt;&lt;/h3&gt;
                &lt;/div&gt;
                
                &lt;div class=&#34;info-card&#34;&gt;
                    &lt;div class=&#34;info-body&#34;&gt;
                        &lt;p class=&#34;gallery-desc&#34;&gt;&lt;/p&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
            &lt;/div&gt;

            &lt;div class=&#34;info-footer&#34;&gt;
                &lt;div class=&#34;gallery-thumbs&#34;&gt;&lt;/div&gt;
            &lt;/div&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;gallery-lightbox&#34;&gt;
        &lt;div class=&#34;lb-toolbar&#34;&gt;
            &lt;span class=&#34;lb-counter&#34;&gt;&lt;/span&gt;
            &lt;div class=&#34;lb-actions&#34;&gt;
                &lt;a class=&#34;lb-btn lb-link-btn&#34; href=&#34;#&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; title=&#34;打开链接/原图&#34;&gt;
                    &lt;svg width=&#34;20&#34; height=&#34;20&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
                &lt;/a&gt;
                &lt;button class=&#34;lb-btn lb-close-btn&#34; title=&#34;关闭&#34;&gt;
                    &lt;svg width=&#34;24&#34; height=&#34;24&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34;&gt;&lt;line x1=&#34;18&#34; y1=&#34;6&#34; x2=&#34;6&#34; y2=&#34;18&#34;&gt;&lt;/line&gt;&lt;line x1=&#34;6&#34; y1=&#34;6&#34; x2=&#34;18&#34; y2=&#34;18&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
                &lt;/button&gt;
            &lt;/div&gt;
        &lt;/div&gt;
        &lt;div class=&#34;lb-canvas&#34;&gt;
            &lt;button class=&#34;lb-nav lb-prev&#34;&gt;
                &lt;svg width=&#34;36&#34; height=&#34;36&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34;&gt;&lt;polyline points=&#34;15 18 9 12 15 6&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
            &lt;div class=&#34;lb-img-wrapper&#34;&gt;
                &lt;img class=&#34;lb-img&#34; src=&#34;&#34; alt=&#34;&#34;&gt;
            &lt;/div&gt;
            &lt;button class=&#34;lb-nav lb-next&#34;&gt;
                &lt;svg width=&#34;36&#34; height=&#34;36&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34;&gt;&lt;polyline points=&#34;9 18 15 12 9 6&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

&lt;style&gt;
     
    .hugo-gallery {
        --g-bg: #ffffff;
        --g-border: #e0e0e0;
        --g-visual-bg: #111;
        --g-text-main: inherit; 
        --g-text-sub: #555;
        --g-card-bg: #f7f9fc;
        --g-card-border: #3b82f6;
        --g-thumb-active: #3b82f6;

        position: relative;
        margin: 2em 0;
        background: var(--g-bg);
        border: 1px solid var(--g-border);
        font-family: inherit; 
        box-sizing: border-box;
    }
    .hugo-gallery * { box-sizing: border-box; }

     
    [data-scheme=&#34;dark&#34;] .hugo-gallery,
    html[data-theme=&#34;dark&#34;] .hugo-gallery,
    body.dark .hugo-gallery {
        --g-bg: #1e1e1e;
        --g-border: #333;
        --g-visual-bg: #000;
        --g-text-sub: #aaa;
        --g-card-bg: #252526;
        --g-card-border: #60a5fa;
        --g-thumb-active: #60a5fa;
    }
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .hugo-gallery {
            --g-bg: #1e1e1e;
            --g-border: #333;
            --g-visual-bg: #000;
            --g-text-sub: #aaa;
            --g-card-bg: #252526;
            --g-card-border: #60a5fa;
            --g-thumb-active: #60a5fa;
        }
    }

     
    .gallery-inline-layout {
        display: grid;
        grid-template-columns: 2fr 1.2fr; 
        height: 550px; 
    }

     
    .visual-column {
        position: relative;
        background: var(--g-visual-bg);
        overflow: hidden;
        display: flex; align-items: center; justify-content: center;
    }
    .gallery-viewport { width: 100%; height: 100%; cursor: zoom-in; }
    .gallery-track { display: flex; height: 100%; transition: transform 0.3s ease; }
    .gallery-slide { 
        flex: 0 0 100%; width: 100%; height: 100%; 
        display: flex; align-items: center; justify-content: center; 
    }
    .gallery-slide img { 
        max-width: 100%; max-height: 100%; 
        object-fit: contain; display: block; 
    }

    .nav-btn {
        position: absolute; top: 50%; transform: translateY(-50%);
        width: 40px; height: 40px;
        background: rgba(255,255,255,0.9);
        border: none; border-radius: 50%; 
        cursor: pointer; color: #000;
        display: flex; align-items: center; justify-content: center;
        opacity: 0; transition: opacity 0.2s; z-index: 10;
    }
    .visual-column:hover .nav-btn { opacity: 1; }
    .prev-btn { left: 15px; }
    .next-btn { right: 15px; }
    .inline-counter {
        position: absolute; top: 15px; right: 15px;
        background: rgba(0,0,0,0.6); color: #fff;
        padding: 4px 8px; border-radius: 4px;
        font-size: 0.85em; pointer-events: none;
    }

     
    .info-column {
        display: flex; flex-direction: column;
        padding: 25px;
        background: var(--g-bg);
        border-left: 1px solid var(--g-border);
        overflow: hidden; 
        color: var(--g-text-main);
        justify-content: flex-start; 
        height: 100%;  
    }
    
    .info-content-top {
         
        flex: 1; 
        display: flex; 
        flex-direction: column;
        min-height: 0;  
        overflow: hidden;  
    }

    .info-header { margin-bottom: 20px; flex-shrink: 0; }
    .gallery-title { margin: 0; line-height: 1.3; color: inherit; }

    .info-card {
         
        flex: 1;
        display: flex; flex-direction: column;
        margin-bottom: 20px; background: var(--g-card-bg);
        border-left: 4px solid var(--g-card-border);
        border-radius: 0 4px 4px 0;
        min-height: 0;  
    }
    .info-body {
         
        flex: 1;
        overflow-y: auto; 
        padding: 15px 20px; 
        scrollbar-width: thin;
    }
    .gallery-desc { 
        margin: 0; color: var(--g-text-sub); 
        line-height: 1.6; white-space: pre-wrap; 
    }
    
     
    .info-footer { 
        flex-shrink: 0; 
        margin-top: auto; 
        padding-top: 20px;
    }
    
    .gallery-thumbs { 
         
        position: relative;
        display: flex; gap: 10px; flex-wrap: wrap; 
        align-items: flex-start;
        max-height: 130px; 
        overflow-y: auto;
        scrollbar-width: thin;
    }
    .hugo-gallery .gallery-thumbs .g-thumb {
        width: 50px !important; height: 50px !important; 
        min-width: 50px !important; min-height: 50px !important;
        flex-shrink: 0; cursor: pointer; opacity: 0.6;
        border: 2px solid transparent; border-radius: 6px; 
        overflow: hidden; position: relative; background: #eee;
        padding: 0 !important; margin: 0 !important;
    }
    .hugo-gallery .gallery-thumbs .g-thumb img { 
        width: 100% !important; height: 100% !important; 
        object-fit: cover !important; display: block !important;
        margin: 0 !important; padding: 0 !important; max-width: none !important;
    }
    .hugo-gallery .gallery-thumbs .g-thumb:hover { opacity: 0.9; }
    .hugo-gallery .gallery-thumbs .g-thumb.active { 
        opacity: 1; border-color: var(--g-thumb-active); 
        box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.2);
    }

     
    @media (max-width: 768px) {
        .gallery-inline-layout { grid-template-columns: 1fr; grid-template-rows: 60vw auto; height: auto; }
        .visual-column { height: 100%; min-height: 250px; }
        .info-column { border-left: none; border-top: 1px solid var(--g-border); height: 400px; padding: 20px; }
        .info-card { background: transparent; border-left: none; padding-left: 0; }
        .info-body { padding: 0; }
        .info-footer { margin-top: auto; }
    }

     
    .gallery-lightbox {
        position: fixed; inset: 0; z-index: 99999;
        background: #000; display: none; flex-direction: column;
        opacity: 0; transition: opacity 0.2s; user-select: none;
    }
    .gallery-lightbox.active { display: flex; opacity: 1; }
    .lb-toolbar {
        position: absolute; top: 0; left: 0; width: 100%; height: 60px;
        display: flex; justify-content: space-between; align-items: center;
        padding: 0 20px; z-index: 20; background: rgba(0,0,0,0.6);
    }
    .lb-counter { color: #ccc; font-size: 0.9em; }
    .lb-actions { display: flex; gap: 15px; }
    .lb-btn { background: transparent; border: none; color: #ddd; cursor: pointer; display: flex; align-items: center; }
    .lb-btn:hover { color: #fff; }
    .lb-canvas {
        flex: 1; width: 100%; height: 100%; position: relative; overflow: hidden;
        display: flex; align-items: center; justify-content: center;
    }
    .lb-img-wrapper { width: 100%; height: 100%; display: flex; align-items: center; justify-content: center; }
    .lb-img { max-width: 100%; max-height: 100%; object-fit: contain; transform-origin: center; will-change: transform; }
    .lb-nav {
        position: absolute; top: 50%; transform: translateY(-50%);
        background: transparent; border: none; color: rgba(255,255,255,0.5);
        padding: 20px; cursor: pointer; z-index: 10;
    }
    .lb-nav:hover { color: #fff; }
    .lb-prev { left: 10px; } .lb-next { right: 10px; }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const galleryId = &#34;gallery-98&#34;;
        const root = document.getElementById(galleryId);
        if (!root) return;

        const track = root.querySelector(&#39;.gallery-track&#39;);
        const slides = Array.from(track.querySelectorAll(&#39;.gallery-slide&#39;));
        if (slides.length === 0) return;

        const titleEl = root.querySelector(&#39;.gallery-title&#39;);
        const descEl = root.querySelector(&#39;.gallery-desc&#39;);
        const counterEl = root.querySelector(&#39;.inline-counter&#39;);
        const thumbsContainer = root.querySelector(&#39;.gallery-thumbs&#39;);
        const infoCard = root.querySelector(&#39;.info-card&#39;);

        const lb = root.querySelector(&#39;.gallery-lightbox&#39;);
        const lbImg = lb.querySelector(&#39;.lb-img&#39;);
        const lbCounter = lb.querySelector(&#39;.lb-counter&#39;);
        const lbLinkBtn = lb.querySelector(&#39;.lb-link-btn&#39;); 
        
        let currentIndex = 0;
        const total = slides.length;
        
        let zoomLevel = 1; let panX = 0, panY = 0; 
        let startX = 0, startY = 0; let initialPanX = 0, initialPanY = 0; 
        let isDragging = false; let hasMoved = false; 
        
        slides.forEach((s, i) =&gt; {
            const thumbSrc = s.dataset.thumb || s.querySelector(&#39;img&#39;).src;
            const t = document.createElement(&#39;div&#39;);
            t.className = i === 0 ? &#39;g-thumb active&#39; : &#39;g-thumb&#39;;
            t.innerHTML = `&lt;img src=&#34;${thumbSrc}&#34; loading=&#34;lazy&#34;&gt;`;
            t.onclick = (e) =&gt; { e.stopPropagation(); switchTo(i); };
            thumbsContainer.appendChild(t);
        });
        const thumbs = thumbsContainer.querySelectorAll(&#39;.g-thumb&#39;);

        
        function safeScrollThumb(container, thumb) {
            if (!container || !thumb) return;
            
            
            const thumbTop = thumb.offsetTop;
            const thumbHeight = thumb.offsetHeight;
            const containerScrollTop = container.scrollTop;
            const containerHeight = container.clientHeight;

            
            if (thumbTop &lt; containerScrollTop) {
                
                container.scrollTop = thumbTop;
            } else if (thumbTop + thumbHeight &gt; containerScrollTop + containerHeight) {
                
                container.scrollTop = thumbTop + thumbHeight - containerHeight;
            }
        }

        function switchTo(index) {
            if (index &lt; 0) index = total - 1;
            if (index &gt;= total) index = 0;
            currentIndex = index;

            track.style.transform = `translateX(${-100 * index}%)`;
            const s = slides[index];
            
            const title = s.dataset.alt || &#34;&#34;;
            const desc = s.dataset.desc || &#34;&#34;;
            
            titleEl.textContent = title;
            descEl.textContent = desc;
            
            titleEl.parentElement.style.display = title ? &#39;block&#39; : &#39;none&#39;;
            if (desc) {
                infoCard.style.display = &#39;flex&#39;;
            } else {
                infoCard.style.display = &#39;none&#39;;
            }
            
            counterEl.textContent = `${index + 1} / ${total}`;

            thumbs.forEach(t =&gt; t.classList.remove(&#39;active&#39;));
            if (thumbs[index]) {
                thumbs[index].classList.add(&#39;active&#39;);
                safeScrollThumb(thumbsContainer, thumbs[index]);
            }

            if (lb.classList.contains(&#39;active&#39;)) {
                updateLightboxImage(index);
            }
        }

        function openLightbox() {
            updateLightboxImage(currentIndex);
            lb.classList.add(&#39;active&#39;);
            document.body.style.overflow = &#39;hidden&#39;; 
        }

        function closeLightbox() {
            lb.classList.remove(&#39;active&#39;);
            document.body.style.overflow = &#39;&#39;;
            setTimeout(resetZoom, 200);
        }

        function updateLightboxImage(index) {
            resetZoom(); 
            lbImg.style.opacity = 0.5;
            const s = slides[index];
            const targetLink = s.dataset.link || s.dataset.src;
            lbLinkBtn.href = targetLink;
            const tempImg = new Image();
            tempImg.src = s.dataset.src;
            tempImg.onload = () =&gt; {
                lbImg.src = s.dataset.src;
                lbImg.style.opacity = 1;
            };
            lbCounter.textContent = `${index + 1} / ${total}`;
        }

        function updateTransform() {
            lbImg.style.transform = `translate(${panX}px, ${panY}px) scale(${zoomLevel})`;
        }

        function resetZoom() {
            zoomLevel = 1; panX = 0; panY = 0;
            lbImg.style.transform = &#39;&#39;;
            lbImg.style.transition = &#39;transform 0.3s ease&#39;; 
        }

        lbImg.addEventListener(&#39;wheel&#39;, (e) =&gt; {
            e.preventDefault();
            const delta = e.deltaY * -0.01;
            zoomLevel = Math.min(Math.max(1, zoomLevel + delta), 5); 
            if (zoomLevel === 1) { panX = 0; panY = 0; }
            lbImg.style.transition = &#39;none&#39;; 
            updateTransform();
        });

        function onDragStart(e) {
            if (zoomLevel &lt;= 1) return; 
            e.preventDefault();
            isDragging = true; hasMoved = false; 
            startX = e.type.includes(&#39;mouse&#39;) ? e.pageX : e.touches[0].pageX;
            startY = e.type.includes(&#39;mouse&#39;) ? e.pageY : e.touches[0].pageY;
            initialPanX = panX; initialPanY = panY;
            lbImg.style.transition = &#39;none&#39;; 
        }

        function onDragMove(e) {
            if (!isDragging) return;
            e.preventDefault();
            const currentX = e.type.includes(&#39;mouse&#39;) ? e.pageX : e.touches[0].pageX;
            const currentY = e.type.includes(&#39;mouse&#39;) ? e.pageY : e.touches[0].pageY;
            const diffX = currentX - startX; const diffY = currentY - startY;
            if (Math.abs(diffX) &gt; 2 || Math.abs(diffY) &gt; 2) hasMoved = true;
            panX = initialPanX + diffX; panY = initialPanY + diffY;
            updateTransform();
        }

        function onDragEnd(e) {
            if (!isDragging) return;
            isDragging = false;
            lbImg.style.transition = &#39;transform 0.1s linear&#39;; 
        }

        lbImg.addEventListener(&#39;click&#39;, (e) =&gt; {
            e.stopPropagation();
            if (hasMoved) { hasMoved = false; return; }
            if (zoomLevel &gt; 1) { resetZoom(); } 
            else { zoomLevel = 2.5; lbImg.style.transition = &#39;transform 0.3s cubic-bezier(0.25, 0.8, 0.25, 1)&#39;; updateTransform(); }
        });

        lbImg.addEventListener(&#39;mousedown&#39;, onDragStart);
        lbImg.addEventListener(&#39;touchstart&#39;, onDragStart);
        window.addEventListener(&#39;mousemove&#39;, onDragMove);
        window.addEventListener(&#39;touchmove&#39;, onDragMove, { passive: false });
        window.addEventListener(&#39;mouseup&#39;, onDragEnd);
        window.addEventListener(&#39;touchend&#39;, onDragEnd);

        root.querySelector(&#39;.gallery-track&#39;).onclick = () =&gt; openLightbox();

        const bindNav = (btn, dir) =&gt; {
            btn.onclick = (e) =&gt; {
                e.preventDefault(); e.stopImmediatePropagation(); 
                switchTo(currentIndex + dir);
            };
        };

        bindNav(root.querySelector(&#39;.prev-btn&#39;), -1);
        bindNav(root.querySelector(&#39;.next-btn&#39;), 1);
        bindNav(lb.querySelector(&#39;.lb-prev&#39;), -1);
        bindNav(lb.querySelector(&#39;.lb-next&#39;), 1);

        lb.querySelector(&#39;.lb-close-btn&#39;).onclick = (e) =&gt; { e.stopPropagation(); closeLightbox(); };
        lbLinkBtn.onclick = (e) =&gt; { e.stopPropagation(); };

        lb.onclick = (e) =&gt; {
            if (e.target === lb || e.target.classList.contains(&#39;lb-canvas&#39;)) closeLightbox();
        };

        document.addEventListener(&#39;keydown&#39;, (e) =&gt; {
            if (!lb.classList.contains(&#39;active&#39;)) return;
            if (e.key === &#39;ArrowLeft&#39;) switchTo(currentIndex - 1);
            if (e.key === &#39;ArrowRight&#39;) switchTo(currentIndex + 1);
            if (e.key === &#39;Escape&#39;) closeLightbox();
        });

        
        switchTo(0);
    })();
&lt;/script&gt;
&lt;div class=&#34;hugo-gallery&#34; id=&#34;gallery-99&#34;&gt;
    &lt;div class=&#34;gallery-inline-layout&#34;&gt;
        
        &lt;div class=&#34;visual-column&#34;&gt;
            &lt;div class=&#34;gallery-viewport&#34;&gt;
                &lt;div class=&#34;gallery-track&#34;&gt;
                    
                        
                        
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20251009-image26.jpg&#34;
                                 data-src=&#34;20251009-image26.jpg&#34; 
                                 data-alt=&#34;蒙古北部的驯鹿部落 摄影师Daniel Kordan&#34; 
                                 data-desc=&#34;&#34;
                                 data-link=&#34;http://www.cnu.cc/works/672897&#34;&gt;
                                &lt;img src=&#34;20251009-image26.jpg&#34; alt=&#34;蒙古北部的驯鹿部落 摄影师Daniel Kordan&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20251009-image27.jpg&#34;
                                 data-src=&#34;20251009-image27.jpg&#34; 
                                 data-alt=&#34;蒙古北部的驯鹿部落 摄影师Daniel Kordan&#34; 
                                 data-desc=&#34;&#34;
                                 data-link=&#34;http://www.cnu.cc/works/672897&#34;&gt;
                                &lt;img src=&#34;20251009-image27.jpg&#34; alt=&#34;蒙古北部的驯鹿部落 摄影师Daniel Kordan&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20251009-image28.jpg&#34;
                                 data-src=&#34;20251009-image28.jpg&#34; 
                                 data-alt=&#34;蒙古北部的驯鹿部落 摄影师Daniel Kordan&#34; 
                                 data-desc=&#34;&#34;
                                 data-link=&#34;http://www.cnu.cc/works/672897&#34;&gt;
                                &lt;img src=&#34;20251009-image28.jpg&#34; alt=&#34;蒙古北部的驯鹿部落 摄影师Daniel Kordan&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20251009-image29.jpg&#34;
                                 data-src=&#34;20251009-image29.jpg&#34; 
                                 data-alt=&#34;蒙古北部的驯鹿部落 摄影师Daniel Kordan&#34; 
                                 data-desc=&#34;&#34;
                                 data-link=&#34;http://www.cnu.cc/works/672897&#34;&gt;
                                &lt;img src=&#34;20251009-image29.jpg&#34; alt=&#34;蒙古北部的驯鹿部落 摄影师Daniel Kordan&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20251009-image30.jpg&#34;
                                 data-src=&#34;20251009-image30.jpg&#34; 
                                 data-alt=&#34;蒙古北部的驯鹿部落 摄影师Daniel Kordan&#34; 
                                 data-desc=&#34;&#34;
                                 data-link=&#34;http://www.cnu.cc/works/672897&#34;&gt;
                                &lt;img src=&#34;20251009-image30.jpg&#34; alt=&#34;蒙古北部的驯鹿部落 摄影师Daniel Kordan&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20251009-image31.jpg&#34;
                                 data-src=&#34;20251009-image31.jpg&#34; 
                                 data-alt=&#34;蒙古北部的驯鹿部落 摄影师Daniel Kordan&#34; 
                                 data-desc=&#34;&#34;
                                 data-link=&#34;http://www.cnu.cc/works/672897&#34;&gt;
                                &lt;img src=&#34;20251009-image31.jpg&#34; alt=&#34;蒙古北部的驯鹿部落 摄影师Daniel Kordan&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20251009-image32.jpg&#34;
                                 data-src=&#34;20251009-image32.jpg&#34; 
                                 data-alt=&#34;蒙古北部的驯鹿部落 摄影师Daniel Kordan&#34; 
                                 data-desc=&#34;&#34;
                                 data-link=&#34;http://www.cnu.cc/works/672897&#34;&gt;
                                &lt;img src=&#34;20251009-image32.jpg&#34; alt=&#34;蒙古北部的驯鹿部落 摄影师Daniel Kordan&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20251009-image33.jpg&#34;
                                 data-src=&#34;20251009-image33.jpg&#34; 
                                 data-alt=&#34;蒙古北部的驯鹿部落 摄影师Daniel Kordan&#34; 
                                 data-desc=&#34;&#34;
                                 data-link=&#34;http://www.cnu.cc/works/672897&#34;&gt;
                                &lt;img src=&#34;20251009-image33.jpg&#34; alt=&#34;蒙古北部的驯鹿部落 摄影师Daniel Kordan&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20251009-image34.jpg&#34;
                                 data-src=&#34;20251009-image34.jpg&#34; 
                                 data-alt=&#34;蒙古北部的驯鹿部落 摄影师Daniel Kordan&#34; 
                                 data-desc=&#34;&#34;
                                 data-link=&#34;http://www.cnu.cc/works/672897&#34;&gt;
                                &lt;img src=&#34;20251009-image34.jpg&#34; alt=&#34;蒙古北部的驯鹿部落 摄影师Daniel Kordan&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20251009-image35.jpg&#34;
                                 data-src=&#34;20251009-image35.jpg&#34; 
                                 data-alt=&#34;蒙古北部的驯鹿部落 摄影师Daniel Kordan&#34; 
                                 data-desc=&#34;&#34;
                                 data-link=&#34;http://www.cnu.cc/works/672897&#34;&gt;
                                &lt;img src=&#34;20251009-image35.jpg&#34; alt=&#34;蒙古北部的驯鹿部落 摄影师Daniel Kordan&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20251009-image36.jpg&#34;
                                 data-src=&#34;20251009-image36.jpg&#34; 
                                 data-alt=&#34;蒙古北部的驯鹿部落 摄影师Daniel Kordan&#34; 
                                 data-desc=&#34;&#34;
                                 data-link=&#34;http://www.cnu.cc/works/672897&#34;&gt;
                                &lt;img src=&#34;20251009-image36.jpg&#34; alt=&#34;蒙古北部的驯鹿部落 摄影师Daniel Kordan&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20251009-image37.jpg&#34;
                                 data-src=&#34;20251009-image37.jpg&#34; 
                                 data-alt=&#34;蒙古北部的驯鹿部落 摄影师Daniel Kordan&#34; 
                                 data-desc=&#34;&#34;
                                 data-link=&#34;http://www.cnu.cc/works/672897&#34;&gt;
                                &lt;img src=&#34;20251009-image37.jpg&#34; alt=&#34;蒙古北部的驯鹿部落 摄影师Daniel Kordan&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20251009-image38.jpg&#34;
                                 data-src=&#34;20251009-image38.jpg&#34; 
                                 data-alt=&#34;蒙古北部的驯鹿部落 摄影师Daniel Kordan&#34; 
                                 data-desc=&#34;&#34;
                                 data-link=&#34;http://www.cnu.cc/works/672897&#34;&gt;
                                &lt;img src=&#34;20251009-image38.jpg&#34; alt=&#34;蒙古北部的驯鹿部落 摄影师Daniel Kordan&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20251009-image39.jpg&#34;
                                 data-src=&#34;20251009-image39.jpg&#34; 
                                 data-alt=&#34;蒙古北部的驯鹿部落 摄影师Daniel Kordan&#34; 
                                 data-desc=&#34;&#34;
                                 data-link=&#34;http://www.cnu.cc/works/672897&#34;&gt;
                                &lt;img src=&#34;20251009-image39.jpg&#34; alt=&#34;蒙古北部的驯鹿部落 摄影师Daniel Kordan&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20251009-image40.jpg&#34;
                                 data-src=&#34;20251009-image40.jpg&#34; 
                                 data-alt=&#34;蒙古北部的驯鹿部落 摄影师Daniel Kordan&#34; 
                                 data-desc=&#34;&#34;
                                 data-link=&#34;http://www.cnu.cc/works/672897&#34;&gt;
                                &lt;img src=&#34;20251009-image40.jpg&#34; alt=&#34;蒙古北部的驯鹿部落 摄影师Daniel Kordan&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20251009-image41.jpg&#34;
                                 data-src=&#34;20251009-image41.jpg&#34; 
                                 data-alt=&#34;蒙古北部的驯鹿部落 摄影师Daniel Kordan&#34; 
                                 data-desc=&#34;&#34;
                                 data-link=&#34;http://www.cnu.cc/works/672897&#34;&gt;
                                &lt;img src=&#34;20251009-image41.jpg&#34; alt=&#34;蒙古北部的驯鹿部落 摄影师Daniel Kordan&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                    
                &lt;/div&gt;
            &lt;/div&gt;

            &lt;button class=&#34;nav-btn prev-btn&#34; aria-label=&#34;Previous&#34;&gt;
                &lt;svg width=&#34;24&#34; height=&#34;24&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;polyline points=&#34;15 18 9 12 15 6&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
            &lt;button class=&#34;nav-btn next-btn&#34; aria-label=&#34;Next&#34;&gt;
                &lt;svg width=&#34;24&#34; height=&#34;24&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;polyline points=&#34;9 18 15 12 9 6&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
            
            &lt;div class=&#34;inline-counter&#34;&gt;1 / 1&lt;/div&gt;
        &lt;/div&gt;

        &lt;div class=&#34;info-column&#34;&gt;
            &lt;div class=&#34;info-content-top&#34;&gt;
                &lt;div class=&#34;info-header&#34;&gt;
                    &lt;h3 class=&#34;gallery-title&#34;&gt;&lt;/h3&gt;
                &lt;/div&gt;
                
                &lt;div class=&#34;info-card&#34;&gt;
                    &lt;div class=&#34;info-body&#34;&gt;
                        &lt;p class=&#34;gallery-desc&#34;&gt;&lt;/p&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
            &lt;/div&gt;

            &lt;div class=&#34;info-footer&#34;&gt;
                &lt;div class=&#34;gallery-thumbs&#34;&gt;&lt;/div&gt;
            &lt;/div&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;gallery-lightbox&#34;&gt;
        &lt;div class=&#34;lb-toolbar&#34;&gt;
            &lt;span class=&#34;lb-counter&#34;&gt;&lt;/span&gt;
            &lt;div class=&#34;lb-actions&#34;&gt;
                &lt;a class=&#34;lb-btn lb-link-btn&#34; href=&#34;#&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; title=&#34;打开链接/原图&#34;&gt;
                    &lt;svg width=&#34;20&#34; height=&#34;20&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
                &lt;/a&gt;
                &lt;button class=&#34;lb-btn lb-close-btn&#34; title=&#34;关闭&#34;&gt;
                    &lt;svg width=&#34;24&#34; height=&#34;24&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34;&gt;&lt;line x1=&#34;18&#34; y1=&#34;6&#34; x2=&#34;6&#34; y2=&#34;18&#34;&gt;&lt;/line&gt;&lt;line x1=&#34;6&#34; y1=&#34;6&#34; x2=&#34;18&#34; y2=&#34;18&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
                &lt;/button&gt;
            &lt;/div&gt;
        &lt;/div&gt;
        &lt;div class=&#34;lb-canvas&#34;&gt;
            &lt;button class=&#34;lb-nav lb-prev&#34;&gt;
                &lt;svg width=&#34;36&#34; height=&#34;36&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34;&gt;&lt;polyline points=&#34;15 18 9 12 15 6&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
            &lt;div class=&#34;lb-img-wrapper&#34;&gt;
                &lt;img class=&#34;lb-img&#34; src=&#34;&#34; alt=&#34;&#34;&gt;
            &lt;/div&gt;
            &lt;button class=&#34;lb-nav lb-next&#34;&gt;
                &lt;svg width=&#34;36&#34; height=&#34;36&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34;&gt;&lt;polyline points=&#34;9 18 15 12 9 6&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

&lt;style&gt;
     
    .hugo-gallery {
        --g-bg: #ffffff;
        --g-border: #e0e0e0;
        --g-visual-bg: #111;
        --g-text-main: inherit; 
        --g-text-sub: #555;
        --g-card-bg: #f7f9fc;
        --g-card-border: #3b82f6;
        --g-thumb-active: #3b82f6;

        position: relative;
        margin: 2em 0;
        background: var(--g-bg);
        border: 1px solid var(--g-border);
        font-family: inherit; 
        box-sizing: border-box;
    }
    .hugo-gallery * { box-sizing: border-box; }

     
    [data-scheme=&#34;dark&#34;] .hugo-gallery,
    html[data-theme=&#34;dark&#34;] .hugo-gallery,
    body.dark .hugo-gallery {
        --g-bg: #1e1e1e;
        --g-border: #333;
        --g-visual-bg: #000;
        --g-text-sub: #aaa;
        --g-card-bg: #252526;
        --g-card-border: #60a5fa;
        --g-thumb-active: #60a5fa;
    }
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .hugo-gallery {
            --g-bg: #1e1e1e;
            --g-border: #333;
            --g-visual-bg: #000;
            --g-text-sub: #aaa;
            --g-card-bg: #252526;
            --g-card-border: #60a5fa;
            --g-thumb-active: #60a5fa;
        }
    }

     
    .gallery-inline-layout {
        display: grid;
        grid-template-columns: 2fr 1.2fr; 
        height: 550px; 
    }

     
    .visual-column {
        position: relative;
        background: var(--g-visual-bg);
        overflow: hidden;
        display: flex; align-items: center; justify-content: center;
    }
    .gallery-viewport { width: 100%; height: 100%; cursor: zoom-in; }
    .gallery-track { display: flex; height: 100%; transition: transform 0.3s ease; }
    .gallery-slide { 
        flex: 0 0 100%; width: 100%; height: 100%; 
        display: flex; align-items: center; justify-content: center; 
    }
    .gallery-slide img { 
        max-width: 100%; max-height: 100%; 
        object-fit: contain; display: block; 
    }

    .nav-btn {
        position: absolute; top: 50%; transform: translateY(-50%);
        width: 40px; height: 40px;
        background: rgba(255,255,255,0.9);
        border: none; border-radius: 50%; 
        cursor: pointer; color: #000;
        display: flex; align-items: center; justify-content: center;
        opacity: 0; transition: opacity 0.2s; z-index: 10;
    }
    .visual-column:hover .nav-btn { opacity: 1; }
    .prev-btn { left: 15px; }
    .next-btn { right: 15px; }
    .inline-counter {
        position: absolute; top: 15px; right: 15px;
        background: rgba(0,0,0,0.6); color: #fff;
        padding: 4px 8px; border-radius: 4px;
        font-size: 0.85em; pointer-events: none;
    }

     
    .info-column {
        display: flex; flex-direction: column;
        padding: 25px;
        background: var(--g-bg);
        border-left: 1px solid var(--g-border);
        overflow: hidden; 
        color: var(--g-text-main);
        justify-content: flex-start; 
        height: 100%;  
    }
    
    .info-content-top {
         
        flex: 1; 
        display: flex; 
        flex-direction: column;
        min-height: 0;  
        overflow: hidden;  
    }

    .info-header { margin-bottom: 20px; flex-shrink: 0; }
    .gallery-title { margin: 0; line-height: 1.3; color: inherit; }

    .info-card {
         
        flex: 1;
        display: flex; flex-direction: column;
        margin-bottom: 20px; background: var(--g-card-bg);
        border-left: 4px solid var(--g-card-border);
        border-radius: 0 4px 4px 0;
        min-height: 0;  
    }
    .info-body {
         
        flex: 1;
        overflow-y: auto; 
        padding: 15px 20px; 
        scrollbar-width: thin;
    }
    .gallery-desc { 
        margin: 0; color: var(--g-text-sub); 
        line-height: 1.6; white-space: pre-wrap; 
    }
    
     
    .info-footer { 
        flex-shrink: 0; 
        margin-top: auto; 
        padding-top: 20px;
    }
    
    .gallery-thumbs { 
         
        position: relative;
        display: flex; gap: 10px; flex-wrap: wrap; 
        align-items: flex-start;
        max-height: 130px; 
        overflow-y: auto;
        scrollbar-width: thin;
    }
    .hugo-gallery .gallery-thumbs .g-thumb {
        width: 50px !important; height: 50px !important; 
        min-width: 50px !important; min-height: 50px !important;
        flex-shrink: 0; cursor: pointer; opacity: 0.6;
        border: 2px solid transparent; border-radius: 6px; 
        overflow: hidden; position: relative; background: #eee;
        padding: 0 !important; margin: 0 !important;
    }
    .hugo-gallery .gallery-thumbs .g-thumb img { 
        width: 100% !important; height: 100% !important; 
        object-fit: cover !important; display: block !important;
        margin: 0 !important; padding: 0 !important; max-width: none !important;
    }
    .hugo-gallery .gallery-thumbs .g-thumb:hover { opacity: 0.9; }
    .hugo-gallery .gallery-thumbs .g-thumb.active { 
        opacity: 1; border-color: var(--g-thumb-active); 
        box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.2);
    }

     
    @media (max-width: 768px) {
        .gallery-inline-layout { grid-template-columns: 1fr; grid-template-rows: 60vw auto; height: auto; }
        .visual-column { height: 100%; min-height: 250px; }
        .info-column { border-left: none; border-top: 1px solid var(--g-border); height: 400px; padding: 20px; }
        .info-card { background: transparent; border-left: none; padding-left: 0; }
        .info-body { padding: 0; }
        .info-footer { margin-top: auto; }
    }

     
    .gallery-lightbox {
        position: fixed; inset: 0; z-index: 99999;
        background: #000; display: none; flex-direction: column;
        opacity: 0; transition: opacity 0.2s; user-select: none;
    }
    .gallery-lightbox.active { display: flex; opacity: 1; }
    .lb-toolbar {
        position: absolute; top: 0; left: 0; width: 100%; height: 60px;
        display: flex; justify-content: space-between; align-items: center;
        padding: 0 20px; z-index: 20; background: rgba(0,0,0,0.6);
    }
    .lb-counter { color: #ccc; font-size: 0.9em; }
    .lb-actions { display: flex; gap: 15px; }
    .lb-btn { background: transparent; border: none; color: #ddd; cursor: pointer; display: flex; align-items: center; }
    .lb-btn:hover { color: #fff; }
    .lb-canvas {
        flex: 1; width: 100%; height: 100%; position: relative; overflow: hidden;
        display: flex; align-items: center; justify-content: center;
    }
    .lb-img-wrapper { width: 100%; height: 100%; display: flex; align-items: center; justify-content: center; }
    .lb-img { max-width: 100%; max-height: 100%; object-fit: contain; transform-origin: center; will-change: transform; }
    .lb-nav {
        position: absolute; top: 50%; transform: translateY(-50%);
        background: transparent; border: none; color: rgba(255,255,255,0.5);
        padding: 20px; cursor: pointer; z-index: 10;
    }
    .lb-nav:hover { color: #fff; }
    .lb-prev { left: 10px; } .lb-next { right: 10px; }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const galleryId = &#34;gallery-99&#34;;
        const root = document.getElementById(galleryId);
        if (!root) return;

        const track = root.querySelector(&#39;.gallery-track&#39;);
        const slides = Array.from(track.querySelectorAll(&#39;.gallery-slide&#39;));
        if (slides.length === 0) return;

        const titleEl = root.querySelector(&#39;.gallery-title&#39;);
        const descEl = root.querySelector(&#39;.gallery-desc&#39;);
        const counterEl = root.querySelector(&#39;.inline-counter&#39;);
        const thumbsContainer = root.querySelector(&#39;.gallery-thumbs&#39;);
        const infoCard = root.querySelector(&#39;.info-card&#39;);

        const lb = root.querySelector(&#39;.gallery-lightbox&#39;);
        const lbImg = lb.querySelector(&#39;.lb-img&#39;);
        const lbCounter = lb.querySelector(&#39;.lb-counter&#39;);
        const lbLinkBtn = lb.querySelector(&#39;.lb-link-btn&#39;); 
        
        let currentIndex = 0;
        const total = slides.length;
        
        let zoomLevel = 1; let panX = 0, panY = 0; 
        let startX = 0, startY = 0; let initialPanX = 0, initialPanY = 0; 
        let isDragging = false; let hasMoved = false; 
        
        slides.forEach((s, i) =&gt; {
            const thumbSrc = s.dataset.thumb || s.querySelector(&#39;img&#39;).src;
            const t = document.createElement(&#39;div&#39;);
            t.className = i === 0 ? &#39;g-thumb active&#39; : &#39;g-thumb&#39;;
            t.innerHTML = `&lt;img src=&#34;${thumbSrc}&#34; loading=&#34;lazy&#34;&gt;`;
            t.onclick = (e) =&gt; { e.stopPropagation(); switchTo(i); };
            thumbsContainer.appendChild(t);
        });
        const thumbs = thumbsContainer.querySelectorAll(&#39;.g-thumb&#39;);

        
        function safeScrollThumb(container, thumb) {
            if (!container || !thumb) return;
            
            
            const thumbTop = thumb.offsetTop;
            const thumbHeight = thumb.offsetHeight;
            const containerScrollTop = container.scrollTop;
            const containerHeight = container.clientHeight;

            
            if (thumbTop &lt; containerScrollTop) {
                
                container.scrollTop = thumbTop;
            } else if (thumbTop + thumbHeight &gt; containerScrollTop + containerHeight) {
                
                container.scrollTop = thumbTop + thumbHeight - containerHeight;
            }
        }

        function switchTo(index) {
            if (index &lt; 0) index = total - 1;
            if (index &gt;= total) index = 0;
            currentIndex = index;

            track.style.transform = `translateX(${-100 * index}%)`;
            const s = slides[index];
            
            const title = s.dataset.alt || &#34;&#34;;
            const desc = s.dataset.desc || &#34;&#34;;
            
            titleEl.textContent = title;
            descEl.textContent = desc;
            
            titleEl.parentElement.style.display = title ? &#39;block&#39; : &#39;none&#39;;
            if (desc) {
                infoCard.style.display = &#39;flex&#39;;
            } else {
                infoCard.style.display = &#39;none&#39;;
            }
            
            counterEl.textContent = `${index + 1} / ${total}`;

            thumbs.forEach(t =&gt; t.classList.remove(&#39;active&#39;));
            if (thumbs[index]) {
                thumbs[index].classList.add(&#39;active&#39;);
                safeScrollThumb(thumbsContainer, thumbs[index]);
            }

            if (lb.classList.contains(&#39;active&#39;)) {
                updateLightboxImage(index);
            }
        }

        function openLightbox() {
            updateLightboxImage(currentIndex);
            lb.classList.add(&#39;active&#39;);
            document.body.style.overflow = &#39;hidden&#39;; 
        }

        function closeLightbox() {
            lb.classList.remove(&#39;active&#39;);
            document.body.style.overflow = &#39;&#39;;
            setTimeout(resetZoom, 200);
        }

        function updateLightboxImage(index) {
            resetZoom(); 
            lbImg.style.opacity = 0.5;
            const s = slides[index];
            const targetLink = s.dataset.link || s.dataset.src;
            lbLinkBtn.href = targetLink;
            const tempImg = new Image();
            tempImg.src = s.dataset.src;
            tempImg.onload = () =&gt; {
                lbImg.src = s.dataset.src;
                lbImg.style.opacity = 1;
            };
            lbCounter.textContent = `${index + 1} / ${total}`;
        }

        function updateTransform() {
            lbImg.style.transform = `translate(${panX}px, ${panY}px) scale(${zoomLevel})`;
        }

        function resetZoom() {
            zoomLevel = 1; panX = 0; panY = 0;
            lbImg.style.transform = &#39;&#39;;
            lbImg.style.transition = &#39;transform 0.3s ease&#39;; 
        }

        lbImg.addEventListener(&#39;wheel&#39;, (e) =&gt; {
            e.preventDefault();
            const delta = e.deltaY * -0.01;
            zoomLevel = Math.min(Math.max(1, zoomLevel + delta), 5); 
            if (zoomLevel === 1) { panX = 0; panY = 0; }
            lbImg.style.transition = &#39;none&#39;; 
            updateTransform();
        });

        function onDragStart(e) {
            if (zoomLevel &lt;= 1) return; 
            e.preventDefault();
            isDragging = true; hasMoved = false; 
            startX = e.type.includes(&#39;mouse&#39;) ? e.pageX : e.touches[0].pageX;
            startY = e.type.includes(&#39;mouse&#39;) ? e.pageY : e.touches[0].pageY;
            initialPanX = panX; initialPanY = panY;
            lbImg.style.transition = &#39;none&#39;; 
        }

        function onDragMove(e) {
            if (!isDragging) return;
            e.preventDefault();
            const currentX = e.type.includes(&#39;mouse&#39;) ? e.pageX : e.touches[0].pageX;
            const currentY = e.type.includes(&#39;mouse&#39;) ? e.pageY : e.touches[0].pageY;
            const diffX = currentX - startX; const diffY = currentY - startY;
            if (Math.abs(diffX) &gt; 2 || Math.abs(diffY) &gt; 2) hasMoved = true;
            panX = initialPanX + diffX; panY = initialPanY + diffY;
            updateTransform();
        }

        function onDragEnd(e) {
            if (!isDragging) return;
            isDragging = false;
            lbImg.style.transition = &#39;transform 0.1s linear&#39;; 
        }

        lbImg.addEventListener(&#39;click&#39;, (e) =&gt; {
            e.stopPropagation();
            if (hasMoved) { hasMoved = false; return; }
            if (zoomLevel &gt; 1) { resetZoom(); } 
            else { zoomLevel = 2.5; lbImg.style.transition = &#39;transform 0.3s cubic-bezier(0.25, 0.8, 0.25, 1)&#39;; updateTransform(); }
        });

        lbImg.addEventListener(&#39;mousedown&#39;, onDragStart);
        lbImg.addEventListener(&#39;touchstart&#39;, onDragStart);
        window.addEventListener(&#39;mousemove&#39;, onDragMove);
        window.addEventListener(&#39;touchmove&#39;, onDragMove, { passive: false });
        window.addEventListener(&#39;mouseup&#39;, onDragEnd);
        window.addEventListener(&#39;touchend&#39;, onDragEnd);

        root.querySelector(&#39;.gallery-track&#39;).onclick = () =&gt; openLightbox();

        const bindNav = (btn, dir) =&gt; {
            btn.onclick = (e) =&gt; {
                e.preventDefault(); e.stopImmediatePropagation(); 
                switchTo(currentIndex + dir);
            };
        };

        bindNav(root.querySelector(&#39;.prev-btn&#39;), -1);
        bindNav(root.querySelector(&#39;.next-btn&#39;), 1);
        bindNav(lb.querySelector(&#39;.lb-prev&#39;), -1);
        bindNav(lb.querySelector(&#39;.lb-next&#39;), 1);

        lb.querySelector(&#39;.lb-close-btn&#39;).onclick = (e) =&gt; { e.stopPropagation(); closeLightbox(); };
        lbLinkBtn.onclick = (e) =&gt; { e.stopPropagation(); };

        lb.onclick = (e) =&gt; {
            if (e.target === lb || e.target.classList.contains(&#39;lb-canvas&#39;)) closeLightbox();
        };

        document.addEventListener(&#39;keydown&#39;, (e) =&gt; {
            if (!lb.classList.contains(&#39;active&#39;)) return;
            if (e.key === &#39;ArrowLeft&#39;) switchTo(currentIndex - 1);
            if (e.key === &#39;ArrowRight&#39;) switchTo(currentIndex + 1);
            if (e.key === &#39;Escape&#39;) closeLightbox();
        });

        
        switchTo(0);
    })();
&lt;/script&gt;
&lt;h2 id=&#34;网站--资源&#34;&gt;网站 &amp;amp; 资源
&lt;/h2&gt;&lt;h3 id=&#34;termeverything&#34;&gt;term.everything
&lt;/h3&gt;



 
   












    
    
    
    
     
    
     
        





    &lt;a href=&#34;https://github.com/mmulet/term.everything&#34; class=&#34;qsl-card&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;
        &lt;div class=&#34;qsl-visual&#34;&gt;
            
                &lt;div class=&#34;qsl-icon-box&#34;&gt;
                    &lt;svg viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;1.5&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34;&gt;&lt;/path&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;/div&gt;
            
        &lt;/div&gt;

        &lt;div class=&#34;qsl-content&#34;&gt;
            &lt;div class=&#34;qsl-meta&#34;&gt;
                &lt;span class=&#34;qsl-badge&#34;&gt;推荐&lt;/span&gt;
                
            &lt;/div&gt;
            
            &lt;h4 class=&#34;qsl-title&#34;&gt;
                term.everything
            &lt;/h4&gt;
            
            &lt;div class=&#34;qsl-summary&#34;&gt;
                在终端中运行任何 GUI 应用程序❗
            &lt;/div&gt;
            
            &lt;span class=&#34;qsl-arrow&#34;&gt;
                阅读全文 &amp;rarr;
            &lt;/span&gt;
        &lt;/div&gt;
    &lt;/a&gt;



&lt;style&gt;
     
    .qsl-card {
         
        --qsl-bg-card: #ffffff;
        --qsl-bg-visual: #f8f9fa;
        
        --qsl-border: rgba(0,0,0,0.08);
        --qsl-border-visual: rgba(0,0,0,0.04);
        
        --qsl-shadow: 0 4px 6px rgba(0,0,0,0.02);
        --qsl-shadow-hover: 0 12px 25px rgba(0,0,0,0.08);
        
        --qsl-text-title: #2d3748;
        --qsl-text-summary: #718096;
        --qsl-text-date: #999999;
        
        --qsl-icon-color: #cbd5e0;
        
        --qsl-badge-bg: rgba(58, 123, 213, 0.1);
        --qsl-badge-text: #3a7bd5;
        
        --qsl-highlight: #3a7bd5;

        display: flex;
        align-items: stretch;
        background: var(--qsl-bg-card);
        border: 1px solid var(--qsl-border);
        border-radius: 12px;
        text-decoration: none !important;
        margin: 2rem 0;
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, border-color 0.2s, background 0.3s;
        font-family: inherit;
        box-shadow: var(--qsl-shadow);
        color: inherit;
        height: 160px;  
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .qsl-card {
            --qsl-bg-card: #1e1e1e;
            --qsl-bg-visual: #252525;
            
            --qsl-border: #333333;
            --qsl-border-visual: #333333;
            
            --qsl-shadow: 0 4px 6px rgba(0,0,0,0.2);
            --qsl-shadow-hover: 0 12px 25px rgba(0,0,0,0.4);
            
            --qsl-text-title: #f0f0f0;
            --qsl-text-summary: #a0aec0;
            --qsl-text-date: #888888;
            
            --qsl-icon-color: #555555;
            
            --qsl-badge-bg: rgba(99, 179, 237, 0.15);
            --qsl-badge-text: #63b3ed;
            
            --qsl-highlight: #63b3ed;
        }
    }

    html[data-scheme=&#34;dark&#34;] .qsl-card {
        --qsl-bg-card: #1e1e1e;
        --qsl-bg-visual: #252525;
        
        --qsl-border: #333333;
        --qsl-border-visual: #333333;
        
        --qsl-shadow: 0 4px 6px rgba(0,0,0,0.2);
        --qsl-shadow-hover: 0 12px 25px rgba(0,0,0,0.4);
        
        --qsl-text-title: #f0f0f0;
        --qsl-text-summary: #a0aec0;
        --qsl-text-date: #888888;
        
        --qsl-icon-color: #555555;
        
        --qsl-badge-bg: rgba(99, 179, 237, 0.15);
        --qsl-badge-text: #63b3ed;
        
        --qsl-highlight: #63b3ed;
    }

    .qsl-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--qsl-shadow-hover);
        border-color: var(--qsl-highlight);
    }

    .qsl-visual {
        width: 140px; 
        flex-shrink: 0;
        background: var(--qsl-bg-visual);
        display: flex;
        align-items: center;
        justify-content: center;
        border-right: 1px solid var(--qsl-border-visual);
        position: relative;
        overflow: hidden;
        transition: background 0.3s, border-color 0.3s;
    }

    .qsl-image {
        width: 100%;
        height: 100%;
        object-fit: cover;
        transition: transform 0.5s ease;
    }
    .qsl-card:hover .qsl-image { transform: scale(1.05); }

    .qsl-icon-box { color: var(--qsl-icon-color); transition: color 0.3s; }
    .qsl-card:hover .qsl-icon-box { color: var(--qsl-highlight); }
    .qsl-icon-box svg { width: 40px; height: 40px; }

    .qsl-content {
        padding: 16px 20px;
        flex: 1;
        display: flex;
        flex-direction: column;
        justify-content: space-between; 
        min-width: 0;
    }

    .qsl-meta {
        display: flex;
        align-items: center;
        gap: 10px;
        font-size: 12px;
    }

    .qsl-badge {
        background: var(--qsl-badge-bg);
        color: var(--qsl-badge-text);
        padding: 2px 8px;
        border-radius: 4px;
        font-weight: 700;
        text-transform: uppercase;
        font-size: 1.1rem;
        transition: background 0.3s, color 0.3s;
    }

    .qsl-date { color: var(--qsl-text-date); transition: color 0.3s; }

    .qsl-title {
        margin: 0;
        font-size: 1.4rem;
        font-weight: 700;
        color: var(--qsl-text-title);
        line-height: 1.4;
        display: -webkit-box;
        -webkit-line-clamp: 2; 
        -webkit-box-orient: vertical;
        overflow: hidden;
        transition: color 0.3s;
    }
    .qsl-card:hover .qsl-title { color: var(--qsl-highlight); }

    .qsl-summary {
        font-size: 1.3rem;
        color: var(--qsl-text-summary);
        line-height: 1.5;
        display: -webkit-box;
        -webkit-line-clamp: 2; 
        -webkit-box-orient: vertical;
        overflow: hidden;
        transition: color 0.3s;
    }

    .qsl-arrow {
        font-size: 12px;
        font-weight: 600;
        color: var(--qsl-highlight);
        opacity: 0;
        transform: translateX(-10px);
        transition: all 0.2s ease;
        margin-top: auto; 
    }
    .qsl-card:hover .qsl-arrow {
        opacity: 1;
        transform: translateX(0);
    }

    @media (max-width: 600px) {
        .qsl-card { flex-direction: column; height: auto; }
        .qsl-visual { width: 100%; height: 140px; border-right: none; border-bottom: 1px solid var(--qsl-border-visual); }
        .qsl-content { padding: 15px; gap: 10px; }
        .qsl-arrow { opacity: 1; transform: none; display: block; margin-top: 5px; }
    }
&lt;/style&gt;
&lt;h3 id=&#34;what-to-eat&#34;&gt;what-to-eat
&lt;/h3&gt;



 
   












    
    
    
    
     
    
     
        





    &lt;a href=&#34;https://github.com/liu-ziting/what-to-eat&#34; class=&#34;qsl-card&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;
        &lt;div class=&#34;qsl-visual&#34;&gt;
            
                &lt;div class=&#34;qsl-icon-box&#34;&gt;
                    &lt;svg viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;1.5&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34;&gt;&lt;/path&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;/div&gt;
            
        &lt;/div&gt;

        &lt;div class=&#34;qsl-content&#34;&gt;
            &lt;div class=&#34;qsl-meta&#34;&gt;
                &lt;span class=&#34;qsl-badge&#34;&gt;推荐&lt;/span&gt;
                
            &lt;/div&gt;
            
            &lt;h4 class=&#34;qsl-title&#34;&gt;
                what-to-eat
            &lt;/h4&gt;
            
            &lt;div class=&#34;qsl-summary&#34;&gt;
                一饭封神：一个基于 AI 的智能菜谱生成平台，支持中华八大菜系 &amp;#43; 国际料理，提供营养分析、酒水推荐、菜谱效果图生成等全方位烹饪指导。
            &lt;/div&gt;
            
            &lt;span class=&#34;qsl-arrow&#34;&gt;
                阅读全文 &amp;rarr;
            &lt;/span&gt;
        &lt;/div&gt;
    &lt;/a&gt;



&lt;style&gt;
     
    .qsl-card {
         
        --qsl-bg-card: #ffffff;
        --qsl-bg-visual: #f8f9fa;
        
        --qsl-border: rgba(0,0,0,0.08);
        --qsl-border-visual: rgba(0,0,0,0.04);
        
        --qsl-shadow: 0 4px 6px rgba(0,0,0,0.02);
        --qsl-shadow-hover: 0 12px 25px rgba(0,0,0,0.08);
        
        --qsl-text-title: #2d3748;
        --qsl-text-summary: #718096;
        --qsl-text-date: #999999;
        
        --qsl-icon-color: #cbd5e0;
        
        --qsl-badge-bg: rgba(58, 123, 213, 0.1);
        --qsl-badge-text: #3a7bd5;
        
        --qsl-highlight: #3a7bd5;

        display: flex;
        align-items: stretch;
        background: var(--qsl-bg-card);
        border: 1px solid var(--qsl-border);
        border-radius: 12px;
        text-decoration: none !important;
        margin: 2rem 0;
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, border-color 0.2s, background 0.3s;
        font-family: inherit;
        box-shadow: var(--qsl-shadow);
        color: inherit;
        height: 160px;  
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .qsl-card {
            --qsl-bg-card: #1e1e1e;
            --qsl-bg-visual: #252525;
            
            --qsl-border: #333333;
            --qsl-border-visual: #333333;
            
            --qsl-shadow: 0 4px 6px rgba(0,0,0,0.2);
            --qsl-shadow-hover: 0 12px 25px rgba(0,0,0,0.4);
            
            --qsl-text-title: #f0f0f0;
            --qsl-text-summary: #a0aec0;
            --qsl-text-date: #888888;
            
            --qsl-icon-color: #555555;
            
            --qsl-badge-bg: rgba(99, 179, 237, 0.15);
            --qsl-badge-text: #63b3ed;
            
            --qsl-highlight: #63b3ed;
        }
    }

    html[data-scheme=&#34;dark&#34;] .qsl-card {
        --qsl-bg-card: #1e1e1e;
        --qsl-bg-visual: #252525;
        
        --qsl-border: #333333;
        --qsl-border-visual: #333333;
        
        --qsl-shadow: 0 4px 6px rgba(0,0,0,0.2);
        --qsl-shadow-hover: 0 12px 25px rgba(0,0,0,0.4);
        
        --qsl-text-title: #f0f0f0;
        --qsl-text-summary: #a0aec0;
        --qsl-text-date: #888888;
        
        --qsl-icon-color: #555555;
        
        --qsl-badge-bg: rgba(99, 179, 237, 0.15);
        --qsl-badge-text: #63b3ed;
        
        --qsl-highlight: #63b3ed;
    }

    .qsl-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--qsl-shadow-hover);
        border-color: var(--qsl-highlight);
    }

    .qsl-visual {
        width: 140px; 
        flex-shrink: 0;
        background: var(--qsl-bg-visual);
        display: flex;
        align-items: center;
        justify-content: center;
        border-right: 1px solid var(--qsl-border-visual);
        position: relative;
        overflow: hidden;
        transition: background 0.3s, border-color 0.3s;
    }

    .qsl-image {
        width: 100%;
        height: 100%;
        object-fit: cover;
        transition: transform 0.5s ease;
    }
    .qsl-card:hover .qsl-image { transform: scale(1.05); }

    .qsl-icon-box { color: var(--qsl-icon-color); transition: color 0.3s; }
    .qsl-card:hover .qsl-icon-box { color: var(--qsl-highlight); }
    .qsl-icon-box svg { width: 40px; height: 40px; }

    .qsl-content {
        padding: 16px 20px;
        flex: 1;
        display: flex;
        flex-direction: column;
        justify-content: space-between; 
        min-width: 0;
    }

    .qsl-meta {
        display: flex;
        align-items: center;
        gap: 10px;
        font-size: 12px;
    }

    .qsl-badge {
        background: var(--qsl-badge-bg);
        color: var(--qsl-badge-text);
        padding: 2px 8px;
        border-radius: 4px;
        font-weight: 700;
        text-transform: uppercase;
        font-size: 1.1rem;
        transition: background 0.3s, color 0.3s;
    }

    .qsl-date { color: var(--qsl-text-date); transition: color 0.3s; }

    .qsl-title {
        margin: 0;
        font-size: 1.4rem;
        font-weight: 700;
        color: var(--qsl-text-title);
        line-height: 1.4;
        display: -webkit-box;
        -webkit-line-clamp: 2; 
        -webkit-box-orient: vertical;
        overflow: hidden;
        transition: color 0.3s;
    }
    .qsl-card:hover .qsl-title { color: var(--qsl-highlight); }

    .qsl-summary {
        font-size: 1.3rem;
        color: var(--qsl-text-summary);
        line-height: 1.5;
        display: -webkit-box;
        -webkit-line-clamp: 2; 
        -webkit-box-orient: vertical;
        overflow: hidden;
        transition: color 0.3s;
    }

    .qsl-arrow {
        font-size: 12px;
        font-weight: 600;
        color: var(--qsl-highlight);
        opacity: 0;
        transform: translateX(-10px);
        transition: all 0.2s ease;
        margin-top: auto; 
    }
    .qsl-card:hover .qsl-arrow {
        opacity: 1;
        transform: translateX(0);
    }

    @media (max-width: 600px) {
        .qsl-card { flex-direction: column; height: auto; }
        .qsl-visual { width: 100%; height: 140px; border-right: none; border-bottom: 1px solid var(--qsl-border-visual); }
        .qsl-content { padding: 15px; gap: 10px; }
        .qsl-arrow { opacity: 1; transform: none; display: block; margin-top: 5px; }
    }
&lt;/style&gt;
&lt;h3 id=&#34;chatlog&#34;&gt;chatlog
&lt;/h3&gt;



 
   












    
    
    
    
     
    
     
        





    &lt;a href=&#34;https://github.com/sjzar/chatlog&#34; class=&#34;qsl-card&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;
        &lt;div class=&#34;qsl-visual&#34;&gt;
            
                &lt;div class=&#34;qsl-icon-box&#34;&gt;
                    &lt;svg viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;1.5&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34;&gt;&lt;/path&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;/div&gt;
            
        &lt;/div&gt;

        &lt;div class=&#34;qsl-content&#34;&gt;
            &lt;div class=&#34;qsl-meta&#34;&gt;
                &lt;span class=&#34;qsl-badge&#34;&gt;推荐&lt;/span&gt;
                
            &lt;/div&gt;
            
            &lt;h4 class=&#34;qsl-title&#34;&gt;
                chatlog
            &lt;/h4&gt;
            
            &lt;div class=&#34;qsl-summary&#34;&gt;
                chat log tool，easily use your own chat data. 聊天记录工具，轻松使用自己的聊天数据
            &lt;/div&gt;
            
            &lt;span class=&#34;qsl-arrow&#34;&gt;
                阅读全文 &amp;rarr;
            &lt;/span&gt;
        &lt;/div&gt;
    &lt;/a&gt;



&lt;style&gt;
     
    .qsl-card {
         
        --qsl-bg-card: #ffffff;
        --qsl-bg-visual: #f8f9fa;
        
        --qsl-border: rgba(0,0,0,0.08);
        --qsl-border-visual: rgba(0,0,0,0.04);
        
        --qsl-shadow: 0 4px 6px rgba(0,0,0,0.02);
        --qsl-shadow-hover: 0 12px 25px rgba(0,0,0,0.08);
        
        --qsl-text-title: #2d3748;
        --qsl-text-summary: #718096;
        --qsl-text-date: #999999;
        
        --qsl-icon-color: #cbd5e0;
        
        --qsl-badge-bg: rgba(58, 123, 213, 0.1);
        --qsl-badge-text: #3a7bd5;
        
        --qsl-highlight: #3a7bd5;

        display: flex;
        align-items: stretch;
        background: var(--qsl-bg-card);
        border: 1px solid var(--qsl-border);
        border-radius: 12px;
        text-decoration: none !important;
        margin: 2rem 0;
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, border-color 0.2s, background 0.3s;
        font-family: inherit;
        box-shadow: var(--qsl-shadow);
        color: inherit;
        height: 160px;  
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .qsl-card {
            --qsl-bg-card: #1e1e1e;
            --qsl-bg-visual: #252525;
            
            --qsl-border: #333333;
            --qsl-border-visual: #333333;
            
            --qsl-shadow: 0 4px 6px rgba(0,0,0,0.2);
            --qsl-shadow-hover: 0 12px 25px rgba(0,0,0,0.4);
            
            --qsl-text-title: #f0f0f0;
            --qsl-text-summary: #a0aec0;
            --qsl-text-date: #888888;
            
            --qsl-icon-color: #555555;
            
            --qsl-badge-bg: rgba(99, 179, 237, 0.15);
            --qsl-badge-text: #63b3ed;
            
            --qsl-highlight: #63b3ed;
        }
    }

    html[data-scheme=&#34;dark&#34;] .qsl-card {
        --qsl-bg-card: #1e1e1e;
        --qsl-bg-visual: #252525;
        
        --qsl-border: #333333;
        --qsl-border-visual: #333333;
        
        --qsl-shadow: 0 4px 6px rgba(0,0,0,0.2);
        --qsl-shadow-hover: 0 12px 25px rgba(0,0,0,0.4);
        
        --qsl-text-title: #f0f0f0;
        --qsl-text-summary: #a0aec0;
        --qsl-text-date: #888888;
        
        --qsl-icon-color: #555555;
        
        --qsl-badge-bg: rgba(99, 179, 237, 0.15);
        --qsl-badge-text: #63b3ed;
        
        --qsl-highlight: #63b3ed;
    }

    .qsl-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--qsl-shadow-hover);
        border-color: var(--qsl-highlight);
    }

    .qsl-visual {
        width: 140px; 
        flex-shrink: 0;
        background: var(--qsl-bg-visual);
        display: flex;
        align-items: center;
        justify-content: center;
        border-right: 1px solid var(--qsl-border-visual);
        position: relative;
        overflow: hidden;
        transition: background 0.3s, border-color 0.3s;
    }

    .qsl-image {
        width: 100%;
        height: 100%;
        object-fit: cover;
        transition: transform 0.5s ease;
    }
    .qsl-card:hover .qsl-image { transform: scale(1.05); }

    .qsl-icon-box { color: var(--qsl-icon-color); transition: color 0.3s; }
    .qsl-card:hover .qsl-icon-box { color: var(--qsl-highlight); }
    .qsl-icon-box svg { width: 40px; height: 40px; }

    .qsl-content {
        padding: 16px 20px;
        flex: 1;
        display: flex;
        flex-direction: column;
        justify-content: space-between; 
        min-width: 0;
    }

    .qsl-meta {
        display: flex;
        align-items: center;
        gap: 10px;
        font-size: 12px;
    }

    .qsl-badge {
        background: var(--qsl-badge-bg);
        color: var(--qsl-badge-text);
        padding: 2px 8px;
        border-radius: 4px;
        font-weight: 700;
        text-transform: uppercase;
        font-size: 1.1rem;
        transition: background 0.3s, color 0.3s;
    }

    .qsl-date { color: var(--qsl-text-date); transition: color 0.3s; }

    .qsl-title {
        margin: 0;
        font-size: 1.4rem;
        font-weight: 700;
        color: var(--qsl-text-title);
        line-height: 1.4;
        display: -webkit-box;
        -webkit-line-clamp: 2; 
        -webkit-box-orient: vertical;
        overflow: hidden;
        transition: color 0.3s;
    }
    .qsl-card:hover .qsl-title { color: var(--qsl-highlight); }

    .qsl-summary {
        font-size: 1.3rem;
        color: var(--qsl-text-summary);
        line-height: 1.5;
        display: -webkit-box;
        -webkit-line-clamp: 2; 
        -webkit-box-orient: vertical;
        overflow: hidden;
        transition: color 0.3s;
    }

    .qsl-arrow {
        font-size: 12px;
        font-weight: 600;
        color: var(--qsl-highlight);
        opacity: 0;
        transform: translateX(-10px);
        transition: all 0.2s ease;
        margin-top: auto; 
    }
    .qsl-card:hover .qsl-arrow {
        opacity: 1;
        transform: translateX(0);
    }

    @media (max-width: 600px) {
        .qsl-card { flex-direction: column; height: auto; }
        .qsl-visual { width: 100%; height: 140px; border-right: none; border-bottom: 1px solid var(--qsl-border-visual); }
        .qsl-content { padding: 15px; gap: 10px; }
        .qsl-arrow { opacity: 1; transform: none; display: block; margin-top: 5px; }
    }
&lt;/style&gt;
&lt;p&gt;Thank &lt;a class=&#34;link&#34; href=&#34;https://www.pexels.com/zh-tw/photo/33916912/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Cover of this article by Sandro Tedeschini&lt;/a&gt;&lt;/p&gt;
</description>
        </item>
        <item>
        <title>「SF周刊」2025年第29 30期（合刊）（总第29-30期）</title>
        <link>https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A2025%E5%B9%B4%E7%AC%AC29-30%E6%9C%9F%E5%90%88%E5%88%8A%E6%80%BB%E7%AC%AC29-30%E6%9C%9F/</link>
        <pubDate>Fri, 26 Sep 2025 00:00:00 +0000</pubDate>
        
        <guid>https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A2025%E5%B9%B4%E7%AC%AC29-30%E6%9C%9F%E5%90%88%E5%88%8A%E6%80%BB%E7%AC%AC29-30%E6%9C%9F/</guid>
        <description>&lt;img src="https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A2025%E5%B9%B4%E7%AC%AC29-30%E6%9C%9F%E5%90%88%E5%88%8A%E6%80%BB%E7%AC%AC29-30%E6%9C%9F/20250926-home.jpg" alt="Featured image of post 「SF周刊」2025年第29 30期（合刊）（总第29-30期）" /&gt;&lt;h2 id=&#34;文章&#34;&gt;文章
&lt;/h2&gt;&lt;h3 id=&#34;从零到一的-dify-ai-工作流搭建指南&#34;&gt;从零到一的 Dify AI 工作流搭建指南
&lt;/h3&gt;&lt;div class=&#34;note-card&#34;&gt;
    &lt;div class=&#34;nc-accent&#34;&gt;&lt;/div&gt;

    &lt;div class=&#34;nc-header&#34;&gt;
        &lt;div class=&#34;nc-meta&#34;&gt;
            &lt;span class=&#34;nc-badge&#34;&gt;READING&lt;/span&gt;
            &lt;span class=&#34;nc-date&#34;&gt;2025-09-26&lt;/span&gt;
        &lt;/div&gt; &lt;a href=&#34;https://sspai.com/post/102434&#34; target=&#34;_blank&#34; class=&#34;nc-title&#34; title=&#34;访问原文&#34;&gt;
            从零到一的 Dify AI 工作流搭建指南
            &lt;svg class=&#34;nc-link-icon&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
        &lt;/a&gt;
    &lt;/div&gt;

    
    &lt;div class=&#34;nc-context&#34;&gt;
        &lt;div class=&#34;nc-quote-icon&#34;&gt;“&lt;/div&gt;
        &lt;div class=&#34;nc-summary-text&#34;&gt;本文是 Dify AI 工作流搭建指南，Dify 是一个低代码 AI 工作流开发平台，适合快速上手 AI 工作流搭建。文章介绍了 Dify 的两种应用类型：Workflow（单轮对话）和 Chatflow（多轮对话），并深入解析了工作流的核心元素——节点和连线，以及参数与变量的概念、类型和管理。指南还详细阐述了模板转换、代码执行、迭代与循环、并行与条件判断、参数提取与问题分类、LLM 节点（包括提示词构建和结构化输出）、RAG 与知识库（父子分块、混合检索）等关键功能。此外，文章强调了 Dify 插件生态的丰富性，并讨论了其在验证想法和支持生产业务方面的价值。&lt;/div&gt;
    &lt;/div&gt;
    

    
    
    
&lt;/div&gt;

&lt;style&gt;
     
    .note-card {
         
        --nc-bg-card: #ffffff;
        --nc-border: rgba(0,0,0,0.04);
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.08);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.12);
        
        --nc-title: #2c3e50;
        --nc-title-hover: #3a7bd5;
        --nc-meta: #999999;
        
        --nc-bg-context: #f8f9fa;
        --nc-border-context: #e2e8f0;
        --nc-quote-icon: #e2e8f0;
        --nc-text-summary: #555555;
        
        --nc-label-bg: #ffffff;
        --nc-label-text: #2d3748;
        --nc-content-text: #2d3748;
        --nc-link-icon: #cbd5e0;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.1);
        --nc-badge-text: #3a7bd5;

        position: relative;
        background: var(--nc-bg-card);
        border-radius: 12px;
        box-shadow: var(--nc-shadow);
        margin: 2.5rem 0;
        overflow: hidden;
        border: 1px solid var(--nc-border);
        font-family: inherit; 
        transition: transform 0.3s ease, box-shadow 0.3s ease, background 0.3s, border-color 0.3s;
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .note-card {
            --nc-bg-card: #1e1e1e;
            --nc-border: #333333;
            --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
            --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
            
            --nc-title: #f0f0f0;
            --nc-meta: #999999;
            
            --nc-bg-context: #252525;
            --nc-border-context: #444444;
            --nc-quote-icon: #333333;
            --nc-text-summary: #aaaaaa;
            
            --nc-label-bg: #1e1e1e;
            --nc-label-text: #cccccc;
            --nc-content-text: #dddddd;
            --nc-link-icon: #666666;
            
            --nc-badge-bg: rgba(58, 123, 213, 0.2);
        }
    }

    html[data-scheme=&#34;dark&#34;] .note-card {
        --nc-bg-card: #1e1e1e;
        --nc-border: #333333;
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
        
        --nc-title: #f0f0f0;
        --nc-meta: #999999;
        
        --nc-bg-context: #252525;
        --nc-border-context: #444444;
        --nc-quote-icon: #333333;
        --nc-text-summary: #aaaaaa;
        
        --nc-label-bg: #1e1e1e;
        --nc-label-text: #cccccc;
        --nc-content-text: #dddddd;
        --nc-link-icon: #666666;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.2);
    }

    .note-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--nc-shadow-hover);
    }

     
    .nc-accent {
        height: 4px;
        background: linear-gradient(90deg, #3a7bd5, #00d2ff); 
        width: 100%;
    }

     
    .nc-header {
        padding: 24px 28px 10px; 
    }

    .nc-meta {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 10px; 
        font-size: 13px; 
        color: var(--nc-meta);
        font-weight: 600;
        letter-spacing: 1px;
        text-transform: uppercase;
    }

    .nc-badge {
        color: var(--nc-badge-text);
        background: var(--nc-badge-bg);
        padding: 2px 6px;
        border-radius: 4px;
    }

    .nc-title {
        display: block;
        font-size: 2rem; 
        font-weight: 700;
        color: var(--nc-title);
        text-decoration: none;
        line-height: 1.3;
        transition: color 0.2s;
    }

    .nc-title:hover {
        color: var(--nc-title-hover);
    }

    .nc-link-icon {
        width: 20px; 
        height: 20px;
        color: var(--nc-link-icon);
        margin-left: 5px;
        vertical-align: middle;
        transition: color 0.2s;
    }

    .nc-title:hover .nc-link-icon {
        color: var(--nc-title-hover);
    }

     
    .nc-context {
        margin: 12px 28px 24px;
        background: var(--nc-bg-context);
        padding: 20px 24px;
        border-radius: 8px;
        position: relative;
        border-left: 4px solid var(--nc-border-context);
        transition: background 0.3s, border-color 0.3s;
    }

    .nc-quote-icon {
        position: absolute;
        top: 8px;
        left: 10px;
        font-family: serif; 
        font-size: 40px;
        line-height: 1;
        color: var(--nc-quote-icon);
        pointer-events: none;
        transition: color 0.3s;
    }

    .nc-summary-text {
        font-size: 1.7rem; 
        color: var(--nc-text-summary);
        line-height: 1.6;
        font-style: italic;
        position: relative;
        z-index: 1;
        padding-left: 15px; 
        transition: color 0.3s;
    }

     
    .nc-body {
        padding: 0 28px 32px;
        position: relative;
    }

     
    .nc-label {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        font-size: 13px; 
        font-weight: 700;
        color: var(--nc-label-text);
        background: var(--nc-label-bg);
        padding-right: 10px;
        margin-bottom: 12px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
        transition: color 0.3s, background 0.3s;
    }

    .nc-content {
        color: var(--nc-content-text);
        font-size: 1.6rem; 
        line-height: 1.75;
        transition: color 0.3s;
    }

     
    .nc-content p { margin-bottom: 1em; }
    .nc-content p:last-child { margin-bottom: 0; }
    
    .nc-content ul { padding-left: 20px; color: inherit; }
    .nc-content li { margin-bottom: 6px; }
&lt;/style&gt;
&lt;h3 id=&#34;上海博物馆东京国立博物馆联合举办宋元明漆器珍品展&#34;&gt;上海博物馆东京国立博物馆联合举办宋元明漆器珍品展
&lt;/h3&gt;&lt;div class=&#34;note-card&#34;&gt;
    &lt;div class=&#34;nc-accent&#34;&gt;&lt;/div&gt;

    &lt;div class=&#34;nc-header&#34;&gt;
        &lt;div class=&#34;nc-meta&#34;&gt;
            &lt;span class=&#34;nc-badge&#34;&gt;READING&lt;/span&gt;
            &lt;span class=&#34;nc-date&#34;&gt;2025-09-26&lt;/span&gt;
        &lt;/div&gt; &lt;a href=&#34;https://m.thepaper.cn/detail/31682876&#34; target=&#34;_blank&#34; class=&#34;nc-title&#34; title=&#34;访问原文&#34;&gt;
            上海博物馆东京国立博物馆联合举办宋元明漆器珍品展
            &lt;svg class=&#34;nc-link-icon&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
        &lt;/a&gt;
    &lt;/div&gt;

    
    &lt;div class=&#34;nc-context&#34;&gt;
        &lt;div class=&#34;nc-quote-icon&#34;&gt;“&lt;/div&gt;
        &lt;div class=&#34;nc-summary-text&#34;&gt;上海博物馆与东京国立博物馆联合举办“红翠斗芳菲：宋元明漆器珍品展”，展出127件中国漆器珍品，其中112件来自日本收藏机构。展览系统梳理了中国漆器的艺术成就，特别是宋元时期的雕漆、填漆、戗金、螺钿等工艺的巅峰之作。由于木质漆器不易保存，许多宋元珍品在中国已罕见，大量精品得以在日本流传保存。展览旨在让中国观众认识到中国漆器艺术的高度，并促进中日文化交流。展览免费向公众开放至2025年11月23日。&lt;/div&gt;
    &lt;/div&gt;
    

    
    
    
&lt;/div&gt;

&lt;style&gt;
     
    .note-card {
         
        --nc-bg-card: #ffffff;
        --nc-border: rgba(0,0,0,0.04);
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.08);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.12);
        
        --nc-title: #2c3e50;
        --nc-title-hover: #3a7bd5;
        --nc-meta: #999999;
        
        --nc-bg-context: #f8f9fa;
        --nc-border-context: #e2e8f0;
        --nc-quote-icon: #e2e8f0;
        --nc-text-summary: #555555;
        
        --nc-label-bg: #ffffff;
        --nc-label-text: #2d3748;
        --nc-content-text: #2d3748;
        --nc-link-icon: #cbd5e0;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.1);
        --nc-badge-text: #3a7bd5;

        position: relative;
        background: var(--nc-bg-card);
        border-radius: 12px;
        box-shadow: var(--nc-shadow);
        margin: 2.5rem 0;
        overflow: hidden;
        border: 1px solid var(--nc-border);
        font-family: inherit; 
        transition: transform 0.3s ease, box-shadow 0.3s ease, background 0.3s, border-color 0.3s;
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .note-card {
            --nc-bg-card: #1e1e1e;
            --nc-border: #333333;
            --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
            --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
            
            --nc-title: #f0f0f0;
            --nc-meta: #999999;
            
            --nc-bg-context: #252525;
            --nc-border-context: #444444;
            --nc-quote-icon: #333333;
            --nc-text-summary: #aaaaaa;
            
            --nc-label-bg: #1e1e1e;
            --nc-label-text: #cccccc;
            --nc-content-text: #dddddd;
            --nc-link-icon: #666666;
            
            --nc-badge-bg: rgba(58, 123, 213, 0.2);
        }
    }

    html[data-scheme=&#34;dark&#34;] .note-card {
        --nc-bg-card: #1e1e1e;
        --nc-border: #333333;
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
        
        --nc-title: #f0f0f0;
        --nc-meta: #999999;
        
        --nc-bg-context: #252525;
        --nc-border-context: #444444;
        --nc-quote-icon: #333333;
        --nc-text-summary: #aaaaaa;
        
        --nc-label-bg: #1e1e1e;
        --nc-label-text: #cccccc;
        --nc-content-text: #dddddd;
        --nc-link-icon: #666666;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.2);
    }

    .note-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--nc-shadow-hover);
    }

     
    .nc-accent {
        height: 4px;
        background: linear-gradient(90deg, #3a7bd5, #00d2ff); 
        width: 100%;
    }

     
    .nc-header {
        padding: 24px 28px 10px; 
    }

    .nc-meta {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 10px; 
        font-size: 13px; 
        color: var(--nc-meta);
        font-weight: 600;
        letter-spacing: 1px;
        text-transform: uppercase;
    }

    .nc-badge {
        color: var(--nc-badge-text);
        background: var(--nc-badge-bg);
        padding: 2px 6px;
        border-radius: 4px;
    }

    .nc-title {
        display: block;
        font-size: 2rem; 
        font-weight: 700;
        color: var(--nc-title);
        text-decoration: none;
        line-height: 1.3;
        transition: color 0.2s;
    }

    .nc-title:hover {
        color: var(--nc-title-hover);
    }

    .nc-link-icon {
        width: 20px; 
        height: 20px;
        color: var(--nc-link-icon);
        margin-left: 5px;
        vertical-align: middle;
        transition: color 0.2s;
    }

    .nc-title:hover .nc-link-icon {
        color: var(--nc-title-hover);
    }

     
    .nc-context {
        margin: 12px 28px 24px;
        background: var(--nc-bg-context);
        padding: 20px 24px;
        border-radius: 8px;
        position: relative;
        border-left: 4px solid var(--nc-border-context);
        transition: background 0.3s, border-color 0.3s;
    }

    .nc-quote-icon {
        position: absolute;
        top: 8px;
        left: 10px;
        font-family: serif; 
        font-size: 40px;
        line-height: 1;
        color: var(--nc-quote-icon);
        pointer-events: none;
        transition: color 0.3s;
    }

    .nc-summary-text {
        font-size: 1.7rem; 
        color: var(--nc-text-summary);
        line-height: 1.6;
        font-style: italic;
        position: relative;
        z-index: 1;
        padding-left: 15px; 
        transition: color 0.3s;
    }

     
    .nc-body {
        padding: 0 28px 32px;
        position: relative;
    }

     
    .nc-label {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        font-size: 13px; 
        font-weight: 700;
        color: var(--nc-label-text);
        background: var(--nc-label-bg);
        padding-right: 10px;
        margin-bottom: 12px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
        transition: color 0.3s, background 0.3s;
    }

    .nc-content {
        color: var(--nc-content-text);
        font-size: 1.6rem; 
        line-height: 1.75;
        transition: color 0.3s;
    }

     
    .nc-content p { margin-bottom: 1em; }
    .nc-content p:last-child { margin-bottom: 0; }
    
    .nc-content ul { padding-left: 20px; color: inherit; }
    .nc-content li { margin-bottom: 6px; }
&lt;/style&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-2&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        孙峰介绍，将日本藏宋元明漆器珍品汇聚一堂，这是少有规格的中国漆器展，办展难度亦很大，得益于上海博物馆和东京国立博物馆长期友好的关系。“这个展览起头很久了，要追溯到汪庆正馆长在世时，他知道东京国立博物馆西冈康宏先生（东京国立博物馆前副馆长、此次展览内容策划）是一位研究中国漆器的专家，就委托他一定要把这些好的中国漆器介绍到中国来，但是展览真正筹备过程大概是6年时间。”
    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-2&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;
&lt;h3 id=&#34;最新研究刷新人类演化时间线&#34;&gt;最新研究刷新人类演化时间线
&lt;/h3&gt;&lt;div class=&#34;note-card&#34;&gt;
    &lt;div class=&#34;nc-accent&#34;&gt;&lt;/div&gt;

    &lt;div class=&#34;nc-header&#34;&gt;
        &lt;div class=&#34;nc-meta&#34;&gt;
            &lt;span class=&#34;nc-badge&#34;&gt;READING&lt;/span&gt;
            &lt;span class=&#34;nc-date&#34;&gt;2025-09-26&lt;/span&gt;
        &lt;/div&gt; &lt;a href=&#34;https://m.thepaper.cn/detail/31683154&#34; target=&#34;_blank&#34; class=&#34;nc-title&#34; title=&#34;访问原文&#34;&gt;
            最新研究刷新人类演化时间线
            &lt;svg class=&#34;nc-link-icon&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
        &lt;/a&gt;
    &lt;/div&gt;

    
    &lt;div class=&#34;nc-context&#34;&gt;
        &lt;div class=&#34;nc-quote-icon&#34;&gt;“&lt;/div&gt;
        &lt;div class=&#34;nc-summary-text&#34;&gt;一项对距今约100万年前的中国古人类头骨化石（“郧县人2号”）的最新分析，揭示了一个与丹尼索瓦人密切相关的新演化支系——“龙人”（Homo longi），并将现代人、尼安德特人与这一亚洲古人类支系的分化时间大幅提前，远超此前学界共识。研究通过高精度CT扫描和数字重建，发现“郧县人2号”头骨具有原始与进步特征并存的形态，脑容量超过1100毫升。这一发现表明，早在100万年前，人类祖先已分化成多个独立群体，远比过去想象的更复杂。亚洲多地出土的中更新世人类化石，包括“龙人”正型头骨，均可归入龙人支系，该支系与智人拥有最近的共同祖先。&lt;/div&gt;
    &lt;/div&gt;
    

    
    
    
&lt;/div&gt;

&lt;style&gt;
     
    .note-card {
         
        --nc-bg-card: #ffffff;
        --nc-border: rgba(0,0,0,0.04);
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.08);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.12);
        
        --nc-title: #2c3e50;
        --nc-title-hover: #3a7bd5;
        --nc-meta: #999999;
        
        --nc-bg-context: #f8f9fa;
        --nc-border-context: #e2e8f0;
        --nc-quote-icon: #e2e8f0;
        --nc-text-summary: #555555;
        
        --nc-label-bg: #ffffff;
        --nc-label-text: #2d3748;
        --nc-content-text: #2d3748;
        --nc-link-icon: #cbd5e0;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.1);
        --nc-badge-text: #3a7bd5;

        position: relative;
        background: var(--nc-bg-card);
        border-radius: 12px;
        box-shadow: var(--nc-shadow);
        margin: 2.5rem 0;
        overflow: hidden;
        border: 1px solid var(--nc-border);
        font-family: inherit; 
        transition: transform 0.3s ease, box-shadow 0.3s ease, background 0.3s, border-color 0.3s;
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .note-card {
            --nc-bg-card: #1e1e1e;
            --nc-border: #333333;
            --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
            --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
            
            --nc-title: #f0f0f0;
            --nc-meta: #999999;
            
            --nc-bg-context: #252525;
            --nc-border-context: #444444;
            --nc-quote-icon: #333333;
            --nc-text-summary: #aaaaaa;
            
            --nc-label-bg: #1e1e1e;
            --nc-label-text: #cccccc;
            --nc-content-text: #dddddd;
            --nc-link-icon: #666666;
            
            --nc-badge-bg: rgba(58, 123, 213, 0.2);
        }
    }

    html[data-scheme=&#34;dark&#34;] .note-card {
        --nc-bg-card: #1e1e1e;
        --nc-border: #333333;
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
        
        --nc-title: #f0f0f0;
        --nc-meta: #999999;
        
        --nc-bg-context: #252525;
        --nc-border-context: #444444;
        --nc-quote-icon: #333333;
        --nc-text-summary: #aaaaaa;
        
        --nc-label-bg: #1e1e1e;
        --nc-label-text: #cccccc;
        --nc-content-text: #dddddd;
        --nc-link-icon: #666666;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.2);
    }

    .note-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--nc-shadow-hover);
    }

     
    .nc-accent {
        height: 4px;
        background: linear-gradient(90deg, #3a7bd5, #00d2ff); 
        width: 100%;
    }

     
    .nc-header {
        padding: 24px 28px 10px; 
    }

    .nc-meta {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 10px; 
        font-size: 13px; 
        color: var(--nc-meta);
        font-weight: 600;
        letter-spacing: 1px;
        text-transform: uppercase;
    }

    .nc-badge {
        color: var(--nc-badge-text);
        background: var(--nc-badge-bg);
        padding: 2px 6px;
        border-radius: 4px;
    }

    .nc-title {
        display: block;
        font-size: 2rem; 
        font-weight: 700;
        color: var(--nc-title);
        text-decoration: none;
        line-height: 1.3;
        transition: color 0.2s;
    }

    .nc-title:hover {
        color: var(--nc-title-hover);
    }

    .nc-link-icon {
        width: 20px; 
        height: 20px;
        color: var(--nc-link-icon);
        margin-left: 5px;
        vertical-align: middle;
        transition: color 0.2s;
    }

    .nc-title:hover .nc-link-icon {
        color: var(--nc-title-hover);
    }

     
    .nc-context {
        margin: 12px 28px 24px;
        background: var(--nc-bg-context);
        padding: 20px 24px;
        border-radius: 8px;
        position: relative;
        border-left: 4px solid var(--nc-border-context);
        transition: background 0.3s, border-color 0.3s;
    }

    .nc-quote-icon {
        position: absolute;
        top: 8px;
        left: 10px;
        font-family: serif; 
        font-size: 40px;
        line-height: 1;
        color: var(--nc-quote-icon);
        pointer-events: none;
        transition: color 0.3s;
    }

    .nc-summary-text {
        font-size: 1.7rem; 
        color: var(--nc-text-summary);
        line-height: 1.6;
        font-style: italic;
        position: relative;
        z-index: 1;
        padding-left: 15px; 
        transition: color 0.3s;
    }

     
    .nc-body {
        padding: 0 28px 32px;
        position: relative;
    }

     
    .nc-label {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        font-size: 13px; 
        font-weight: 700;
        color: var(--nc-label-text);
        background: var(--nc-label-bg);
        padding-right: 10px;
        margin-bottom: 12px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
        transition: color 0.3s, background 0.3s;
    }

    .nc-content {
        color: var(--nc-content-text);
        font-size: 1.6rem; 
        line-height: 1.75;
        transition: color 0.3s;
    }

     
    .nc-content p { margin-bottom: 1em; }
    .nc-content p:last-child { margin-bottom: 0; }
    
    .nc-content ul { padding-left: 20px; color: inherit; }
    .nc-content li { margin-bottom: 6px; }
&lt;/style&gt;
&lt;h3 id=&#34;new-reports-expose-the-global-toll-of-censorship-新的报告揭露了全球审查制度的代价&#34;&gt;New Reports Expose the Global Toll of Censorship 新的报告揭露了全球审查制度的代价
&lt;/h3&gt;&lt;div class=&#34;note-card&#34;&gt;
    &lt;div class=&#34;nc-accent&#34;&gt;&lt;/div&gt;

    &lt;div class=&#34;nc-header&#34;&gt;
        &lt;div class=&#34;nc-meta&#34;&gt;
            &lt;span class=&#34;nc-badge&#34;&gt;READING&lt;/span&gt;
            &lt;span class=&#34;nc-date&#34;&gt;2025-09-26&lt;/span&gt;
        &lt;/div&gt; &lt;a href=&#34;https://m.thepaper.cn/detail/31683154&#34; target=&#34;_blank&#34; class=&#34;nc-title&#34; title=&#34;访问原文&#34;&gt;
            New Reports Expose the Global Toll of Censorship 新的报告揭露了全球审查制度的代价
            &lt;svg class=&#34;nc-link-icon&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
        &lt;/a&gt;
    &lt;/div&gt;

    
    &lt;div class=&#34;nc-context&#34;&gt;
        &lt;div class=&#34;nc-quote-icon&#34;&gt;“&lt;/div&gt;
        &lt;div class=&#34;nc-summary-text&#34;&gt;全球表达自由显著下降，70%人口（52亿人）生活在受限环境中。最新报告显示，过去十年中，每新增一名享有表达自由的人，就有19人失去自由。艺术界尤其受到压制，艺术家面临审查、监禁和骚扰，即使在民主国家也是如此。地缘政治紧张、资金压力和新法律导致普遍的焦虑和自我审查。许多艺术机构 director 报告称，因压力而面临不展示特定作品的挑战。这种压迫形式多样，从公开的禁令、监禁到隐蔽的资金剥夺、网络骚扰等，共同造成一种难以察觉但极具腐蚀性的自我审查氛围。&lt;/div&gt;
    &lt;/div&gt;
    

    
    
    
&lt;/div&gt;

&lt;style&gt;
     
    .note-card {
         
        --nc-bg-card: #ffffff;
        --nc-border: rgba(0,0,0,0.04);
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.08);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.12);
        
        --nc-title: #2c3e50;
        --nc-title-hover: #3a7bd5;
        --nc-meta: #999999;
        
        --nc-bg-context: #f8f9fa;
        --nc-border-context: #e2e8f0;
        --nc-quote-icon: #e2e8f0;
        --nc-text-summary: #555555;
        
        --nc-label-bg: #ffffff;
        --nc-label-text: #2d3748;
        --nc-content-text: #2d3748;
        --nc-link-icon: #cbd5e0;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.1);
        --nc-badge-text: #3a7bd5;

        position: relative;
        background: var(--nc-bg-card);
        border-radius: 12px;
        box-shadow: var(--nc-shadow);
        margin: 2.5rem 0;
        overflow: hidden;
        border: 1px solid var(--nc-border);
        font-family: inherit; 
        transition: transform 0.3s ease, box-shadow 0.3s ease, background 0.3s, border-color 0.3s;
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .note-card {
            --nc-bg-card: #1e1e1e;
            --nc-border: #333333;
            --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
            --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
            
            --nc-title: #f0f0f0;
            --nc-meta: #999999;
            
            --nc-bg-context: #252525;
            --nc-border-context: #444444;
            --nc-quote-icon: #333333;
            --nc-text-summary: #aaaaaa;
            
            --nc-label-bg: #1e1e1e;
            --nc-label-text: #cccccc;
            --nc-content-text: #dddddd;
            --nc-link-icon: #666666;
            
            --nc-badge-bg: rgba(58, 123, 213, 0.2);
        }
    }

    html[data-scheme=&#34;dark&#34;] .note-card {
        --nc-bg-card: #1e1e1e;
        --nc-border: #333333;
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
        
        --nc-title: #f0f0f0;
        --nc-meta: #999999;
        
        --nc-bg-context: #252525;
        --nc-border-context: #444444;
        --nc-quote-icon: #333333;
        --nc-text-summary: #aaaaaa;
        
        --nc-label-bg: #1e1e1e;
        --nc-label-text: #cccccc;
        --nc-content-text: #dddddd;
        --nc-link-icon: #666666;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.2);
    }

    .note-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--nc-shadow-hover);
    }

     
    .nc-accent {
        height: 4px;
        background: linear-gradient(90deg, #3a7bd5, #00d2ff); 
        width: 100%;
    }

     
    .nc-header {
        padding: 24px 28px 10px; 
    }

    .nc-meta {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 10px; 
        font-size: 13px; 
        color: var(--nc-meta);
        font-weight: 600;
        letter-spacing: 1px;
        text-transform: uppercase;
    }

    .nc-badge {
        color: var(--nc-badge-text);
        background: var(--nc-badge-bg);
        padding: 2px 6px;
        border-radius: 4px;
    }

    .nc-title {
        display: block;
        font-size: 2rem; 
        font-weight: 700;
        color: var(--nc-title);
        text-decoration: none;
        line-height: 1.3;
        transition: color 0.2s;
    }

    .nc-title:hover {
        color: var(--nc-title-hover);
    }

    .nc-link-icon {
        width: 20px; 
        height: 20px;
        color: var(--nc-link-icon);
        margin-left: 5px;
        vertical-align: middle;
        transition: color 0.2s;
    }

    .nc-title:hover .nc-link-icon {
        color: var(--nc-title-hover);
    }

     
    .nc-context {
        margin: 12px 28px 24px;
        background: var(--nc-bg-context);
        padding: 20px 24px;
        border-radius: 8px;
        position: relative;
        border-left: 4px solid var(--nc-border-context);
        transition: background 0.3s, border-color 0.3s;
    }

    .nc-quote-icon {
        position: absolute;
        top: 8px;
        left: 10px;
        font-family: serif; 
        font-size: 40px;
        line-height: 1;
        color: var(--nc-quote-icon);
        pointer-events: none;
        transition: color 0.3s;
    }

    .nc-summary-text {
        font-size: 1.7rem; 
        color: var(--nc-text-summary);
        line-height: 1.6;
        font-style: italic;
        position: relative;
        z-index: 1;
        padding-left: 15px; 
        transition: color 0.3s;
    }

     
    .nc-body {
        padding: 0 28px 32px;
        position: relative;
    }

     
    .nc-label {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        font-size: 13px; 
        font-weight: 700;
        color: var(--nc-label-text);
        background: var(--nc-label-bg);
        padding-right: 10px;
        margin-bottom: 12px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
        transition: color 0.3s, background 0.3s;
    }

    .nc-content {
        color: var(--nc-content-text);
        font-size: 1.6rem; 
        line-height: 1.75;
        transition: color 0.3s;
    }

     
    .nc-content p { margin-bottom: 1em; }
    .nc-content p:last-child { margin-bottom: 0; }
    
    .nc-content ul { padding-left: 20px; color: inherit; }
    .nc-content li { margin-bottom: 6px; }
&lt;/style&gt;
&lt;h3 id=&#34;proxychimeraoracle-calarts-annual-postgraduate-exhibition-代理奇美拉神谕加州艺术学院年度研究生展览&#34;&gt;Proxy，Chimera，Oracle: CalArts Annual Postgraduate Exhibition 代理、奇美拉、神谕：加州艺术学院年度研究生展览
&lt;/h3&gt;&lt;div class=&#34;note-card&#34;&gt;
    &lt;div class=&#34;nc-accent&#34;&gt;&lt;/div&gt;

    &lt;div class=&#34;nc-header&#34;&gt;
        &lt;div class=&#34;nc-meta&#34;&gt;
            &lt;span class=&#34;nc-badge&#34;&gt;READING&lt;/span&gt;
            &lt;span class=&#34;nc-date&#34;&gt;2025-09-26&lt;/span&gt;
        &lt;/div&gt; &lt;a href=&#34;https://kill-the-newsletter.com/feeds/ib1xav9ntb1widd1/entries/5py7wmweiwhbctbli8xw.html&#34; target=&#34;_blank&#34; class=&#34;nc-title&#34; title=&#34;访问原文&#34;&gt;
            Proxy，Chimera，Oracle: CalArts Annual Postgraduate Exhibition 代理、奇美拉、神谕：加州艺术学院年度研究生展览
            &lt;svg class=&#34;nc-link-icon&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
        &lt;/a&gt;
    &lt;/div&gt;

    
    &lt;div class=&#34;nc-context&#34;&gt;
        &lt;div class=&#34;nc-quote-icon&#34;&gt;“&lt;/div&gt;
        &lt;div class=&#34;nc-summary-text&#34;&gt;加州艺术学院（CalArts）的年度研究生展览“代理、奇美拉、神谕”于2025年10月11日至11月22日在洛杉矶市中心的CalArts at The Reef举行。展览展出了近三十位近期毕业于CalArts艺术学院MFA项目的艺术家的最新作品，涵盖雕塑、电影、绘画和混合媒体等多种形式。作品回应了个人和系统性的损失、盗窃、精神债务以及不确定性，艺术家们通过“代理”来争取时间或延伸感受与记忆，通过“奇美拉”的嬗变描绘出希望的路径，并通过“神谕”预测未来。展览期间还将举办艺术家讲座、表演等公共活动，并配有出版物。&lt;/div&gt;
    &lt;/div&gt;
    

    
    
    
&lt;/div&gt;

&lt;style&gt;
     
    .note-card {
         
        --nc-bg-card: #ffffff;
        --nc-border: rgba(0,0,0,0.04);
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.08);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.12);
        
        --nc-title: #2c3e50;
        --nc-title-hover: #3a7bd5;
        --nc-meta: #999999;
        
        --nc-bg-context: #f8f9fa;
        --nc-border-context: #e2e8f0;
        --nc-quote-icon: #e2e8f0;
        --nc-text-summary: #555555;
        
        --nc-label-bg: #ffffff;
        --nc-label-text: #2d3748;
        --nc-content-text: #2d3748;
        --nc-link-icon: #cbd5e0;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.1);
        --nc-badge-text: #3a7bd5;

        position: relative;
        background: var(--nc-bg-card);
        border-radius: 12px;
        box-shadow: var(--nc-shadow);
        margin: 2.5rem 0;
        overflow: hidden;
        border: 1px solid var(--nc-border);
        font-family: inherit; 
        transition: transform 0.3s ease, box-shadow 0.3s ease, background 0.3s, border-color 0.3s;
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .note-card {
            --nc-bg-card: #1e1e1e;
            --nc-border: #333333;
            --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
            --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
            
            --nc-title: #f0f0f0;
            --nc-meta: #999999;
            
            --nc-bg-context: #252525;
            --nc-border-context: #444444;
            --nc-quote-icon: #333333;
            --nc-text-summary: #aaaaaa;
            
            --nc-label-bg: #1e1e1e;
            --nc-label-text: #cccccc;
            --nc-content-text: #dddddd;
            --nc-link-icon: #666666;
            
            --nc-badge-bg: rgba(58, 123, 213, 0.2);
        }
    }

    html[data-scheme=&#34;dark&#34;] .note-card {
        --nc-bg-card: #1e1e1e;
        --nc-border: #333333;
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
        
        --nc-title: #f0f0f0;
        --nc-meta: #999999;
        
        --nc-bg-context: #252525;
        --nc-border-context: #444444;
        --nc-quote-icon: #333333;
        --nc-text-summary: #aaaaaa;
        
        --nc-label-bg: #1e1e1e;
        --nc-label-text: #cccccc;
        --nc-content-text: #dddddd;
        --nc-link-icon: #666666;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.2);
    }

    .note-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--nc-shadow-hover);
    }

     
    .nc-accent {
        height: 4px;
        background: linear-gradient(90deg, #3a7bd5, #00d2ff); 
        width: 100%;
    }

     
    .nc-header {
        padding: 24px 28px 10px; 
    }

    .nc-meta {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 10px; 
        font-size: 13px; 
        color: var(--nc-meta);
        font-weight: 600;
        letter-spacing: 1px;
        text-transform: uppercase;
    }

    .nc-badge {
        color: var(--nc-badge-text);
        background: var(--nc-badge-bg);
        padding: 2px 6px;
        border-radius: 4px;
    }

    .nc-title {
        display: block;
        font-size: 2rem; 
        font-weight: 700;
        color: var(--nc-title);
        text-decoration: none;
        line-height: 1.3;
        transition: color 0.2s;
    }

    .nc-title:hover {
        color: var(--nc-title-hover);
    }

    .nc-link-icon {
        width: 20px; 
        height: 20px;
        color: var(--nc-link-icon);
        margin-left: 5px;
        vertical-align: middle;
        transition: color 0.2s;
    }

    .nc-title:hover .nc-link-icon {
        color: var(--nc-title-hover);
    }

     
    .nc-context {
        margin: 12px 28px 24px;
        background: var(--nc-bg-context);
        padding: 20px 24px;
        border-radius: 8px;
        position: relative;
        border-left: 4px solid var(--nc-border-context);
        transition: background 0.3s, border-color 0.3s;
    }

    .nc-quote-icon {
        position: absolute;
        top: 8px;
        left: 10px;
        font-family: serif; 
        font-size: 40px;
        line-height: 1;
        color: var(--nc-quote-icon);
        pointer-events: none;
        transition: color 0.3s;
    }

    .nc-summary-text {
        font-size: 1.7rem; 
        color: var(--nc-text-summary);
        line-height: 1.6;
        font-style: italic;
        position: relative;
        z-index: 1;
        padding-left: 15px; 
        transition: color 0.3s;
    }

     
    .nc-body {
        padding: 0 28px 32px;
        position: relative;
    }

     
    .nc-label {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        font-size: 13px; 
        font-weight: 700;
        color: var(--nc-label-text);
        background: var(--nc-label-bg);
        padding-right: 10px;
        margin-bottom: 12px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
        transition: color 0.3s, background 0.3s;
    }

    .nc-content {
        color: var(--nc-content-text);
        font-size: 1.6rem; 
        line-height: 1.75;
        transition: color 0.3s;
    }

     
    .nc-content p { margin-bottom: 1em; }
    .nc-content p:last-child { margin-bottom: 0; }
    
    .nc-content ul { padding-left: 20px; color: inherit; }
    .nc-content li { margin-bottom: 6px; }
&lt;/style&gt;
&lt;h3 id=&#34;institut-valencià-dart-modern-begins-new-phase-based-on-sustainabilityheritageand-territory-巴伦西亚现代艺术博物馆开启以可持续性遗产和地域为基础的新阶段&#34;&gt;Institut Valencià D’Art Modern Begins New Phase Based on Sustainability，Heritage，and Territory 巴伦西亚现代艺术博物馆开启以可持续性、遗产和地域为基础的新阶段
&lt;/h3&gt;&lt;div class=&#34;note-card&#34;&gt;
    &lt;div class=&#34;nc-accent&#34;&gt;&lt;/div&gt;

    &lt;div class=&#34;nc-header&#34;&gt;
        &lt;div class=&#34;nc-meta&#34;&gt;
            &lt;span class=&#34;nc-badge&#34;&gt;READING&lt;/span&gt;
            &lt;span class=&#34;nc-date&#34;&gt;2025-09-26&lt;/span&gt;
        &lt;/div&gt; &lt;a href=&#34;https://hyperallergic.com/1043370/institut-valencia-d-art-modern-new-phase-kara-walker-inhabiting-the-shadows/&#34; target=&#34;_blank&#34; class=&#34;nc-title&#34; title=&#34;访问原文&#34;&gt;
            Institut Valencià D’Art Modern Begins New Phase Based on Sustainability，Heritage，and Territory 巴伦西亚现代艺术博物馆开启以可持续性、遗产和地域为基础的新阶段
            &lt;svg class=&#34;nc-link-icon&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
        &lt;/a&gt;
    &lt;/div&gt;

    
    &lt;div class=&#34;nc-context&#34;&gt;
        &lt;div class=&#34;nc-quote-icon&#34;&gt;“&lt;/div&gt;
        &lt;div class=&#34;nc-summary-text&#34;&gt;瓦伦西亚现代艺术博物馆（IVAM）在馆长布兰卡·德·拉·托雷的领导下，开启新篇章，重点关注可持续性、遗产和地域。秋季推出两场新展览，展出国际知名艺术家卡拉·沃克和克里斯蒂娜·加西亚·罗德罗的作品。同时，博物馆将拓展电影、音乐等跨学科活动，并启动“两栖博物馆”项目，融合艺术、知识与环保。展览“卡拉·沃克：燃烧的村庄”将展出其44件作品，并引出关于集体记忆的群展“栖居暗影”。秋末还将展出摄影师克里斯蒂娜·加西亚·罗德罗记录西班牙各地传统的“隐藏的西班牙”。IVAM还将关注本土艺术，展出“‘规范艺术’之前的瓦伦西亚”以及安德烈亚·卡内帕的特定场地项目“深度与距离之间”。&lt;/div&gt;
    &lt;/div&gt;
    

    
    
    
&lt;/div&gt;

&lt;style&gt;
     
    .note-card {
         
        --nc-bg-card: #ffffff;
        --nc-border: rgba(0,0,0,0.04);
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.08);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.12);
        
        --nc-title: #2c3e50;
        --nc-title-hover: #3a7bd5;
        --nc-meta: #999999;
        
        --nc-bg-context: #f8f9fa;
        --nc-border-context: #e2e8f0;
        --nc-quote-icon: #e2e8f0;
        --nc-text-summary: #555555;
        
        --nc-label-bg: #ffffff;
        --nc-label-text: #2d3748;
        --nc-content-text: #2d3748;
        --nc-link-icon: #cbd5e0;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.1);
        --nc-badge-text: #3a7bd5;

        position: relative;
        background: var(--nc-bg-card);
        border-radius: 12px;
        box-shadow: var(--nc-shadow);
        margin: 2.5rem 0;
        overflow: hidden;
        border: 1px solid var(--nc-border);
        font-family: inherit; 
        transition: transform 0.3s ease, box-shadow 0.3s ease, background 0.3s, border-color 0.3s;
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .note-card {
            --nc-bg-card: #1e1e1e;
            --nc-border: #333333;
            --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
            --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
            
            --nc-title: #f0f0f0;
            --nc-meta: #999999;
            
            --nc-bg-context: #252525;
            --nc-border-context: #444444;
            --nc-quote-icon: #333333;
            --nc-text-summary: #aaaaaa;
            
            --nc-label-bg: #1e1e1e;
            --nc-label-text: #cccccc;
            --nc-content-text: #dddddd;
            --nc-link-icon: #666666;
            
            --nc-badge-bg: rgba(58, 123, 213, 0.2);
        }
    }

    html[data-scheme=&#34;dark&#34;] .note-card {
        --nc-bg-card: #1e1e1e;
        --nc-border: #333333;
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
        
        --nc-title: #f0f0f0;
        --nc-meta: #999999;
        
        --nc-bg-context: #252525;
        --nc-border-context: #444444;
        --nc-quote-icon: #333333;
        --nc-text-summary: #aaaaaa;
        
        --nc-label-bg: #1e1e1e;
        --nc-label-text: #cccccc;
        --nc-content-text: #dddddd;
        --nc-link-icon: #666666;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.2);
    }

    .note-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--nc-shadow-hover);
    }

     
    .nc-accent {
        height: 4px;
        background: linear-gradient(90deg, #3a7bd5, #00d2ff); 
        width: 100%;
    }

     
    .nc-header {
        padding: 24px 28px 10px; 
    }

    .nc-meta {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 10px; 
        font-size: 13px; 
        color: var(--nc-meta);
        font-weight: 600;
        letter-spacing: 1px;
        text-transform: uppercase;
    }

    .nc-badge {
        color: var(--nc-badge-text);
        background: var(--nc-badge-bg);
        padding: 2px 6px;
        border-radius: 4px;
    }

    .nc-title {
        display: block;
        font-size: 2rem; 
        font-weight: 700;
        color: var(--nc-title);
        text-decoration: none;
        line-height: 1.3;
        transition: color 0.2s;
    }

    .nc-title:hover {
        color: var(--nc-title-hover);
    }

    .nc-link-icon {
        width: 20px; 
        height: 20px;
        color: var(--nc-link-icon);
        margin-left: 5px;
        vertical-align: middle;
        transition: color 0.2s;
    }

    .nc-title:hover .nc-link-icon {
        color: var(--nc-title-hover);
    }

     
    .nc-context {
        margin: 12px 28px 24px;
        background: var(--nc-bg-context);
        padding: 20px 24px;
        border-radius: 8px;
        position: relative;
        border-left: 4px solid var(--nc-border-context);
        transition: background 0.3s, border-color 0.3s;
    }

    .nc-quote-icon {
        position: absolute;
        top: 8px;
        left: 10px;
        font-family: serif; 
        font-size: 40px;
        line-height: 1;
        color: var(--nc-quote-icon);
        pointer-events: none;
        transition: color 0.3s;
    }

    .nc-summary-text {
        font-size: 1.7rem; 
        color: var(--nc-text-summary);
        line-height: 1.6;
        font-style: italic;
        position: relative;
        z-index: 1;
        padding-left: 15px; 
        transition: color 0.3s;
    }

     
    .nc-body {
        padding: 0 28px 32px;
        position: relative;
    }

     
    .nc-label {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        font-size: 13px; 
        font-weight: 700;
        color: var(--nc-label-text);
        background: var(--nc-label-bg);
        padding-right: 10px;
        margin-bottom: 12px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
        transition: color 0.3s, background 0.3s;
    }

    .nc-content {
        color: var(--nc-content-text);
        font-size: 1.6rem; 
        line-height: 1.75;
        transition: color 0.3s;
    }

     
    .nc-content p { margin-bottom: 1em; }
    .nc-content p:last-child { margin-bottom: 0; }
    
    .nc-content ul { padding-left: 20px; color: inherit; }
    .nc-content li { margin-bottom: 6px; }
&lt;/style&gt;
&lt;h3 id=&#34;haegue-yang-leap-year-at-migros-museum-für-gegenwartskunst-海奎杨日历年leap-year于苏黎世移民博物馆&#34;&gt;Haegue Yang: Leap Year at Migros Museum Für Gegenwartskunst 海奎·杨：日历年（Leap Year）于苏黎世移民博物馆
&lt;/h3&gt;&lt;div class=&#34;note-card&#34;&gt;
    &lt;div class=&#34;nc-accent&#34;&gt;&lt;/div&gt;

    &lt;div class=&#34;nc-header&#34;&gt;
        &lt;div class=&#34;nc-meta&#34;&gt;
            &lt;span class=&#34;nc-badge&#34;&gt;READING&lt;/span&gt;
            &lt;span class=&#34;nc-date&#34;&gt;2025-09-26&lt;/span&gt;
        &lt;/div&gt; &lt;a href=&#34;https://kill-the-newsletter.com/feeds/ib1xav9ntb1widd1/entries/a0t724rm62pxm7h18x7n.html&#34; target=&#34;_blank&#34; class=&#34;nc-title&#34; title=&#34;访问原文&#34;&gt;
            Haegue Yang: Leap Year at Migros Museum Für Gegenwartskunst 海奎·杨：日历年（Leap Year）于苏黎世移民博物馆
            &lt;svg class=&#34;nc-link-icon&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
        &lt;/a&gt;
    &lt;/div&gt;

    
    &lt;div class=&#34;nc-context&#34;&gt;
        &lt;div class=&#34;nc-quote-icon&#34;&gt;“&lt;/div&gt;
        &lt;div class=&#34;nc-summary-text&#34;&gt;海奎·杨在苏黎世Migros当代艺术博物馆举办其在瑞士的首次大型回顾展“闰年”。展览跨越三十余年，涵盖雕塑、装置、影像等多种媒介，展现了艺术家对身份、迁徙、记忆和社会文化联系的探索。展览分为“运动”、“精神性”、“社群”和“日常”四个主题，通过混合材料、多元文化借鉴和对艺术史的对话，揭示了个人经验与集体记忆的交织，以及在跨文化语境中展现出的韧性和适应性。新委托作品《Sonic Arch Rope–Gold Hexagon Light》和《Sonic Droplets in Gradation–Water Veil》也强调了运动和感官体验。&lt;/div&gt;
    &lt;/div&gt;
    

    
    
    
&lt;/div&gt;

&lt;style&gt;
     
    .note-card {
         
        --nc-bg-card: #ffffff;
        --nc-border: rgba(0,0,0,0.04);
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.08);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.12);
        
        --nc-title: #2c3e50;
        --nc-title-hover: #3a7bd5;
        --nc-meta: #999999;
        
        --nc-bg-context: #f8f9fa;
        --nc-border-context: #e2e8f0;
        --nc-quote-icon: #e2e8f0;
        --nc-text-summary: #555555;
        
        --nc-label-bg: #ffffff;
        --nc-label-text: #2d3748;
        --nc-content-text: #2d3748;
        --nc-link-icon: #cbd5e0;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.1);
        --nc-badge-text: #3a7bd5;

        position: relative;
        background: var(--nc-bg-card);
        border-radius: 12px;
        box-shadow: var(--nc-shadow);
        margin: 2.5rem 0;
        overflow: hidden;
        border: 1px solid var(--nc-border);
        font-family: inherit; 
        transition: transform 0.3s ease, box-shadow 0.3s ease, background 0.3s, border-color 0.3s;
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .note-card {
            --nc-bg-card: #1e1e1e;
            --nc-border: #333333;
            --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
            --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
            
            --nc-title: #f0f0f0;
            --nc-meta: #999999;
            
            --nc-bg-context: #252525;
            --nc-border-context: #444444;
            --nc-quote-icon: #333333;
            --nc-text-summary: #aaaaaa;
            
            --nc-label-bg: #1e1e1e;
            --nc-label-text: #cccccc;
            --nc-content-text: #dddddd;
            --nc-link-icon: #666666;
            
            --nc-badge-bg: rgba(58, 123, 213, 0.2);
        }
    }

    html[data-scheme=&#34;dark&#34;] .note-card {
        --nc-bg-card: #1e1e1e;
        --nc-border: #333333;
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
        
        --nc-title: #f0f0f0;
        --nc-meta: #999999;
        
        --nc-bg-context: #252525;
        --nc-border-context: #444444;
        --nc-quote-icon: #333333;
        --nc-text-summary: #aaaaaa;
        
        --nc-label-bg: #1e1e1e;
        --nc-label-text: #cccccc;
        --nc-content-text: #dddddd;
        --nc-link-icon: #666666;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.2);
    }

    .note-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--nc-shadow-hover);
    }

     
    .nc-accent {
        height: 4px;
        background: linear-gradient(90deg, #3a7bd5, #00d2ff); 
        width: 100%;
    }

     
    .nc-header {
        padding: 24px 28px 10px; 
    }

    .nc-meta {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 10px; 
        font-size: 13px; 
        color: var(--nc-meta);
        font-weight: 600;
        letter-spacing: 1px;
        text-transform: uppercase;
    }

    .nc-badge {
        color: var(--nc-badge-text);
        background: var(--nc-badge-bg);
        padding: 2px 6px;
        border-radius: 4px;
    }

    .nc-title {
        display: block;
        font-size: 2rem; 
        font-weight: 700;
        color: var(--nc-title);
        text-decoration: none;
        line-height: 1.3;
        transition: color 0.2s;
    }

    .nc-title:hover {
        color: var(--nc-title-hover);
    }

    .nc-link-icon {
        width: 20px; 
        height: 20px;
        color: var(--nc-link-icon);
        margin-left: 5px;
        vertical-align: middle;
        transition: color 0.2s;
    }

    .nc-title:hover .nc-link-icon {
        color: var(--nc-title-hover);
    }

     
    .nc-context {
        margin: 12px 28px 24px;
        background: var(--nc-bg-context);
        padding: 20px 24px;
        border-radius: 8px;
        position: relative;
        border-left: 4px solid var(--nc-border-context);
        transition: background 0.3s, border-color 0.3s;
    }

    .nc-quote-icon {
        position: absolute;
        top: 8px;
        left: 10px;
        font-family: serif; 
        font-size: 40px;
        line-height: 1;
        color: var(--nc-quote-icon);
        pointer-events: none;
        transition: color 0.3s;
    }

    .nc-summary-text {
        font-size: 1.7rem; 
        color: var(--nc-text-summary);
        line-height: 1.6;
        font-style: italic;
        position: relative;
        z-index: 1;
        padding-left: 15px; 
        transition: color 0.3s;
    }

     
    .nc-body {
        padding: 0 28px 32px;
        position: relative;
    }

     
    .nc-label {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        font-size: 13px; 
        font-weight: 700;
        color: var(--nc-label-text);
        background: var(--nc-label-bg);
        padding-right: 10px;
        margin-bottom: 12px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
        transition: color 0.3s, background 0.3s;
    }

    .nc-content {
        color: var(--nc-content-text);
        font-size: 1.6rem; 
        line-height: 1.75;
        transition: color 0.3s;
    }

     
    .nc-content p { margin-bottom: 1em; }
    .nc-content p:last-child { margin-bottom: 0; }
    
    .nc-content ul { padding-left: 20px; color: inherit; }
    .nc-content li { margin-bottom: 6px; }
&lt;/style&gt;
&lt;h3 id=&#34;人人都是艺术家去上海西岸看激浪派特展&#34;&gt;人人都是艺术家？去上海西岸看“激浪派”特展
&lt;/h3&gt;&lt;div class=&#34;note-card&#34;&gt;
    &lt;div class=&#34;nc-accent&#34;&gt;&lt;/div&gt;

    &lt;div class=&#34;nc-header&#34;&gt;
        &lt;div class=&#34;nc-meta&#34;&gt;
            &lt;span class=&#34;nc-badge&#34;&gt;READING&lt;/span&gt;
            &lt;span class=&#34;nc-date&#34;&gt;2025-09-26&lt;/span&gt;
        &lt;/div&gt; &lt;a href=&#34;https://m.thepaper.cn/detail/31682694&#34; target=&#34;_blank&#34; class=&#34;nc-title&#34; title=&#34;访问原文&#34;&gt;
            人人都是艺术家？去上海西岸看“激浪派”特展
            &lt;svg class=&#34;nc-link-icon&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
        &lt;/a&gt;
    &lt;/div&gt;

    
    &lt;div class=&#34;nc-context&#34;&gt;
        &lt;div class=&#34;nc-quote-icon&#34;&gt;“&lt;/div&gt;
        &lt;div class=&#34;nc-summary-text&#34;&gt;上海西岸美术馆正展出“偶然！激浪派！”特展，这是激浪派首次在中国进行整体展示。该展览源自西岸美术馆与法国蓬皮杜中心的合作，展出200余件藏品，追溯了这个20世纪极具颠覆性的艺术流派。激浪派打破艺术与生活的界限，认为日常物品甚至呼吸都可以成为艺术媒介。展览强调“偶然”的概念，并探讨了杜尚和约翰·凯奇等先驱的影响。策展人认为约翰·凯奇是激浪派的关键人物，他的观念影响了小野洋子等艺术家。展览还通过乔治·布莱希特的《三种布置》等作品，引发观众思考艺术的边界和原作的定义。展览还包括中国艺术家的作品，探讨激浪派精神在中国当代艺术中的发展。&lt;/div&gt;
    &lt;/div&gt;
    

    
    
    
&lt;/div&gt;

&lt;style&gt;
     
    .note-card {
         
        --nc-bg-card: #ffffff;
        --nc-border: rgba(0,0,0,0.04);
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.08);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.12);
        
        --nc-title: #2c3e50;
        --nc-title-hover: #3a7bd5;
        --nc-meta: #999999;
        
        --nc-bg-context: #f8f9fa;
        --nc-border-context: #e2e8f0;
        --nc-quote-icon: #e2e8f0;
        --nc-text-summary: #555555;
        
        --nc-label-bg: #ffffff;
        --nc-label-text: #2d3748;
        --nc-content-text: #2d3748;
        --nc-link-icon: #cbd5e0;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.1);
        --nc-badge-text: #3a7bd5;

        position: relative;
        background: var(--nc-bg-card);
        border-radius: 12px;
        box-shadow: var(--nc-shadow);
        margin: 2.5rem 0;
        overflow: hidden;
        border: 1px solid var(--nc-border);
        font-family: inherit; 
        transition: transform 0.3s ease, box-shadow 0.3s ease, background 0.3s, border-color 0.3s;
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .note-card {
            --nc-bg-card: #1e1e1e;
            --nc-border: #333333;
            --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
            --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
            
            --nc-title: #f0f0f0;
            --nc-meta: #999999;
            
            --nc-bg-context: #252525;
            --nc-border-context: #444444;
            --nc-quote-icon: #333333;
            --nc-text-summary: #aaaaaa;
            
            --nc-label-bg: #1e1e1e;
            --nc-label-text: #cccccc;
            --nc-content-text: #dddddd;
            --nc-link-icon: #666666;
            
            --nc-badge-bg: rgba(58, 123, 213, 0.2);
        }
    }

    html[data-scheme=&#34;dark&#34;] .note-card {
        --nc-bg-card: #1e1e1e;
        --nc-border: #333333;
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
        
        --nc-title: #f0f0f0;
        --nc-meta: #999999;
        
        --nc-bg-context: #252525;
        --nc-border-context: #444444;
        --nc-quote-icon: #333333;
        --nc-text-summary: #aaaaaa;
        
        --nc-label-bg: #1e1e1e;
        --nc-label-text: #cccccc;
        --nc-content-text: #dddddd;
        --nc-link-icon: #666666;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.2);
    }

    .note-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--nc-shadow-hover);
    }

     
    .nc-accent {
        height: 4px;
        background: linear-gradient(90deg, #3a7bd5, #00d2ff); 
        width: 100%;
    }

     
    .nc-header {
        padding: 24px 28px 10px; 
    }

    .nc-meta {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 10px; 
        font-size: 13px; 
        color: var(--nc-meta);
        font-weight: 600;
        letter-spacing: 1px;
        text-transform: uppercase;
    }

    .nc-badge {
        color: var(--nc-badge-text);
        background: var(--nc-badge-bg);
        padding: 2px 6px;
        border-radius: 4px;
    }

    .nc-title {
        display: block;
        font-size: 2rem; 
        font-weight: 700;
        color: var(--nc-title);
        text-decoration: none;
        line-height: 1.3;
        transition: color 0.2s;
    }

    .nc-title:hover {
        color: var(--nc-title-hover);
    }

    .nc-link-icon {
        width: 20px; 
        height: 20px;
        color: var(--nc-link-icon);
        margin-left: 5px;
        vertical-align: middle;
        transition: color 0.2s;
    }

    .nc-title:hover .nc-link-icon {
        color: var(--nc-title-hover);
    }

     
    .nc-context {
        margin: 12px 28px 24px;
        background: var(--nc-bg-context);
        padding: 20px 24px;
        border-radius: 8px;
        position: relative;
        border-left: 4px solid var(--nc-border-context);
        transition: background 0.3s, border-color 0.3s;
    }

    .nc-quote-icon {
        position: absolute;
        top: 8px;
        left: 10px;
        font-family: serif; 
        font-size: 40px;
        line-height: 1;
        color: var(--nc-quote-icon);
        pointer-events: none;
        transition: color 0.3s;
    }

    .nc-summary-text {
        font-size: 1.7rem; 
        color: var(--nc-text-summary);
        line-height: 1.6;
        font-style: italic;
        position: relative;
        z-index: 1;
        padding-left: 15px; 
        transition: color 0.3s;
    }

     
    .nc-body {
        padding: 0 28px 32px;
        position: relative;
    }

     
    .nc-label {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        font-size: 13px; 
        font-weight: 700;
        color: var(--nc-label-text);
        background: var(--nc-label-bg);
        padding-right: 10px;
        margin-bottom: 12px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
        transition: color 0.3s, background 0.3s;
    }

    .nc-content {
        color: var(--nc-content-text);
        font-size: 1.6rem; 
        line-height: 1.75;
        transition: color 0.3s;
    }

     
    .nc-content p { margin-bottom: 1em; }
    .nc-content p:last-child { margin-bottom: 0; }
    
    .nc-content ul { padding-left: 20px; color: inherit; }
    .nc-content li { margin-bottom: 6px; }
&lt;/style&gt;
&lt;h3 id=&#34;our-enduring-fascination-with-ancient-roman-baths-我们对古罗马浴场的持久迷恋&#34;&gt;Our Enduring Fascination With Ancient Roman Baths 我们对古罗马浴场的持久迷恋
&lt;/h3&gt;&lt;div class=&#34;note-card&#34;&gt;
    &lt;div class=&#34;nc-accent&#34;&gt;&lt;/div&gt;

    &lt;div class=&#34;nc-header&#34;&gt;
        &lt;div class=&#34;nc-meta&#34;&gt;
            &lt;span class=&#34;nc-badge&#34;&gt;READING&lt;/span&gt;
            &lt;span class=&#34;nc-date&#34;&gt;2025-09-26&lt;/span&gt;
        &lt;/div&gt; &lt;a href=&#34;https://hyperallergic.com/1043102/our-enduring-fascination-with-ancient-roman-baths/&#34; target=&#34;_blank&#34; class=&#34;nc-title&#34; title=&#34;访问原文&#34;&gt;
            Our Enduring Fascination With Ancient Roman Baths 我们对古罗马浴场的持久迷恋
            &lt;svg class=&#34;nc-link-icon&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
        &lt;/a&gt;
    &lt;/div&gt;

    
    &lt;div class=&#34;nc-context&#34;&gt;
        &lt;div class=&#34;nc-quote-icon&#34;&gt;“&lt;/div&gt;
        &lt;div class=&#34;nc-summary-text&#34;&gt;古罗马浴场不仅是清洁身体的场所，也集社交、阅读、展示财富和艺术欣赏于一体。近期，考古学家在西班牙、意大利和土耳其等地发现了多处保存完好的古罗马浴场遗址。这些浴场规模宏大，装饰精美，如马赛克地板，显示了当时城市的繁荣。除了公共浴场，富人还建造私人浴池，这些浴池同样奢华，并带有艺术装饰。浴场中的马赛克艺术有时也反映日常生活，例如展示了古罗马人穿人字拖的习惯。这表明，无论古今，浴场都是一个集休闲、社交和展示的场所，体现了人们对高品质生活和社交的需求。&lt;/div&gt;
    &lt;/div&gt;
    

    
    
    
&lt;/div&gt;

&lt;style&gt;
     
    .note-card {
         
        --nc-bg-card: #ffffff;
        --nc-border: rgba(0,0,0,0.04);
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.08);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.12);
        
        --nc-title: #2c3e50;
        --nc-title-hover: #3a7bd5;
        --nc-meta: #999999;
        
        --nc-bg-context: #f8f9fa;
        --nc-border-context: #e2e8f0;
        --nc-quote-icon: #e2e8f0;
        --nc-text-summary: #555555;
        
        --nc-label-bg: #ffffff;
        --nc-label-text: #2d3748;
        --nc-content-text: #2d3748;
        --nc-link-icon: #cbd5e0;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.1);
        --nc-badge-text: #3a7bd5;

        position: relative;
        background: var(--nc-bg-card);
        border-radius: 12px;
        box-shadow: var(--nc-shadow);
        margin: 2.5rem 0;
        overflow: hidden;
        border: 1px solid var(--nc-border);
        font-family: inherit; 
        transition: transform 0.3s ease, box-shadow 0.3s ease, background 0.3s, border-color 0.3s;
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .note-card {
            --nc-bg-card: #1e1e1e;
            --nc-border: #333333;
            --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
            --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
            
            --nc-title: #f0f0f0;
            --nc-meta: #999999;
            
            --nc-bg-context: #252525;
            --nc-border-context: #444444;
            --nc-quote-icon: #333333;
            --nc-text-summary: #aaaaaa;
            
            --nc-label-bg: #1e1e1e;
            --nc-label-text: #cccccc;
            --nc-content-text: #dddddd;
            --nc-link-icon: #666666;
            
            --nc-badge-bg: rgba(58, 123, 213, 0.2);
        }
    }

    html[data-scheme=&#34;dark&#34;] .note-card {
        --nc-bg-card: #1e1e1e;
        --nc-border: #333333;
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
        
        --nc-title: #f0f0f0;
        --nc-meta: #999999;
        
        --nc-bg-context: #252525;
        --nc-border-context: #444444;
        --nc-quote-icon: #333333;
        --nc-text-summary: #aaaaaa;
        
        --nc-label-bg: #1e1e1e;
        --nc-label-text: #cccccc;
        --nc-content-text: #dddddd;
        --nc-link-icon: #666666;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.2);
    }

    .note-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--nc-shadow-hover);
    }

     
    .nc-accent {
        height: 4px;
        background: linear-gradient(90deg, #3a7bd5, #00d2ff); 
        width: 100%;
    }

     
    .nc-header {
        padding: 24px 28px 10px; 
    }

    .nc-meta {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 10px; 
        font-size: 13px; 
        color: var(--nc-meta);
        font-weight: 600;
        letter-spacing: 1px;
        text-transform: uppercase;
    }

    .nc-badge {
        color: var(--nc-badge-text);
        background: var(--nc-badge-bg);
        padding: 2px 6px;
        border-radius: 4px;
    }

    .nc-title {
        display: block;
        font-size: 2rem; 
        font-weight: 700;
        color: var(--nc-title);
        text-decoration: none;
        line-height: 1.3;
        transition: color 0.2s;
    }

    .nc-title:hover {
        color: var(--nc-title-hover);
    }

    .nc-link-icon {
        width: 20px; 
        height: 20px;
        color: var(--nc-link-icon);
        margin-left: 5px;
        vertical-align: middle;
        transition: color 0.2s;
    }

    .nc-title:hover .nc-link-icon {
        color: var(--nc-title-hover);
    }

     
    .nc-context {
        margin: 12px 28px 24px;
        background: var(--nc-bg-context);
        padding: 20px 24px;
        border-radius: 8px;
        position: relative;
        border-left: 4px solid var(--nc-border-context);
        transition: background 0.3s, border-color 0.3s;
    }

    .nc-quote-icon {
        position: absolute;
        top: 8px;
        left: 10px;
        font-family: serif; 
        font-size: 40px;
        line-height: 1;
        color: var(--nc-quote-icon);
        pointer-events: none;
        transition: color 0.3s;
    }

    .nc-summary-text {
        font-size: 1.7rem; 
        color: var(--nc-text-summary);
        line-height: 1.6;
        font-style: italic;
        position: relative;
        z-index: 1;
        padding-left: 15px; 
        transition: color 0.3s;
    }

     
    .nc-body {
        padding: 0 28px 32px;
        position: relative;
    }

     
    .nc-label {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        font-size: 13px; 
        font-weight: 700;
        color: var(--nc-label-text);
        background: var(--nc-label-bg);
        padding-right: 10px;
        margin-bottom: 12px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
        transition: color 0.3s, background 0.3s;
    }

    .nc-content {
        color: var(--nc-content-text);
        font-size: 1.6rem; 
        line-height: 1.75;
        transition: color 0.3s;
    }

     
    .nc-content p { margin-bottom: 1em; }
    .nc-content p:last-child { margin-bottom: 0; }
    
    .nc-content ul { padding-left: 20px; color: inherit; }
    .nc-content li { margin-bottom: 6px; }
&lt;/style&gt;
&lt;h3 id=&#34;the-paradoxical-promise-of-postwar-liberation-战后解放的悖论式承诺&#34;&gt;The Paradoxical Promise of Postwar Liberation 战后解放的悖论式承诺
&lt;/h3&gt;&lt;div class=&#34;note-card&#34;&gt;
    &lt;div class=&#34;nc-accent&#34;&gt;&lt;/div&gt;

    &lt;div class=&#34;nc-header&#34;&gt;
        &lt;div class=&#34;nc-meta&#34;&gt;
            &lt;span class=&#34;nc-badge&#34;&gt;READING&lt;/span&gt;
            &lt;span class=&#34;nc-date&#34;&gt;2025-09-26&lt;/span&gt;
        &lt;/div&gt; &lt;a href=&#34;https://hyperallergic.com/1044443/the-paradoxical-promise-of-postwar-liberation-occupied-japan-alicia-volk/&#34; target=&#34;_blank&#34; class=&#34;nc-title&#34; title=&#34;访问原文&#34;&gt;
            The Paradoxical Promise of Postwar Liberation 战后解放的悖论式承诺
            &lt;svg class=&#34;nc-link-icon&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
        &lt;/a&gt;
    &lt;/div&gt;

    
    &lt;div class=&#34;nc-context&#34;&gt;
        &lt;div class=&#34;nc-quote-icon&#34;&gt;“&lt;/div&gt;
        &lt;div class=&#34;nc-summary-text&#34;&gt;二战后，日本艺术家在盟军占领下，面临着是迎合占领者还是保持自主的艺术困境。Alicia Volk 的著作《帝国阴影下：占领日本的艺术》深入探讨了这一时期多元且矛盾的艺术创作。书中分析了包括“创作版画”和“人民版画”在内的不同艺术流派，以及女性艺术家如岸田节子和赤松俊子如何通过绘画和参与公共辩论来表达自我和关注社会议题。著作还讨论了战后纪念碑和雕塑所引发的争议，揭示了这些艺术品远非简单的历史遗物，而是政治和文化对话的关键载体。该书强调，占领时期的日本艺术应被视为东亚现代艺术史中不可或缺的组成部分，而非被边缘化的时期。&lt;/div&gt;
    &lt;/div&gt;
    

    
    
    
&lt;/div&gt;

&lt;style&gt;
     
    .note-card {
         
        --nc-bg-card: #ffffff;
        --nc-border: rgba(0,0,0,0.04);
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.08);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.12);
        
        --nc-title: #2c3e50;
        --nc-title-hover: #3a7bd5;
        --nc-meta: #999999;
        
        --nc-bg-context: #f8f9fa;
        --nc-border-context: #e2e8f0;
        --nc-quote-icon: #e2e8f0;
        --nc-text-summary: #555555;
        
        --nc-label-bg: #ffffff;
        --nc-label-text: #2d3748;
        --nc-content-text: #2d3748;
        --nc-link-icon: #cbd5e0;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.1);
        --nc-badge-text: #3a7bd5;

        position: relative;
        background: var(--nc-bg-card);
        border-radius: 12px;
        box-shadow: var(--nc-shadow);
        margin: 2.5rem 0;
        overflow: hidden;
        border: 1px solid var(--nc-border);
        font-family: inherit; 
        transition: transform 0.3s ease, box-shadow 0.3s ease, background 0.3s, border-color 0.3s;
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .note-card {
            --nc-bg-card: #1e1e1e;
            --nc-border: #333333;
            --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
            --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
            
            --nc-title: #f0f0f0;
            --nc-meta: #999999;
            
            --nc-bg-context: #252525;
            --nc-border-context: #444444;
            --nc-quote-icon: #333333;
            --nc-text-summary: #aaaaaa;
            
            --nc-label-bg: #1e1e1e;
            --nc-label-text: #cccccc;
            --nc-content-text: #dddddd;
            --nc-link-icon: #666666;
            
            --nc-badge-bg: rgba(58, 123, 213, 0.2);
        }
    }

    html[data-scheme=&#34;dark&#34;] .note-card {
        --nc-bg-card: #1e1e1e;
        --nc-border: #333333;
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
        
        --nc-title: #f0f0f0;
        --nc-meta: #999999;
        
        --nc-bg-context: #252525;
        --nc-border-context: #444444;
        --nc-quote-icon: #333333;
        --nc-text-summary: #aaaaaa;
        
        --nc-label-bg: #1e1e1e;
        --nc-label-text: #cccccc;
        --nc-content-text: #dddddd;
        --nc-link-icon: #666666;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.2);
    }

    .note-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--nc-shadow-hover);
    }

     
    .nc-accent {
        height: 4px;
        background: linear-gradient(90deg, #3a7bd5, #00d2ff); 
        width: 100%;
    }

     
    .nc-header {
        padding: 24px 28px 10px; 
    }

    .nc-meta {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 10px; 
        font-size: 13px; 
        color: var(--nc-meta);
        font-weight: 600;
        letter-spacing: 1px;
        text-transform: uppercase;
    }

    .nc-badge {
        color: var(--nc-badge-text);
        background: var(--nc-badge-bg);
        padding: 2px 6px;
        border-radius: 4px;
    }

    .nc-title {
        display: block;
        font-size: 2rem; 
        font-weight: 700;
        color: var(--nc-title);
        text-decoration: none;
        line-height: 1.3;
        transition: color 0.2s;
    }

    .nc-title:hover {
        color: var(--nc-title-hover);
    }

    .nc-link-icon {
        width: 20px; 
        height: 20px;
        color: var(--nc-link-icon);
        margin-left: 5px;
        vertical-align: middle;
        transition: color 0.2s;
    }

    .nc-title:hover .nc-link-icon {
        color: var(--nc-title-hover);
    }

     
    .nc-context {
        margin: 12px 28px 24px;
        background: var(--nc-bg-context);
        padding: 20px 24px;
        border-radius: 8px;
        position: relative;
        border-left: 4px solid var(--nc-border-context);
        transition: background 0.3s, border-color 0.3s;
    }

    .nc-quote-icon {
        position: absolute;
        top: 8px;
        left: 10px;
        font-family: serif; 
        font-size: 40px;
        line-height: 1;
        color: var(--nc-quote-icon);
        pointer-events: none;
        transition: color 0.3s;
    }

    .nc-summary-text {
        font-size: 1.7rem; 
        color: var(--nc-text-summary);
        line-height: 1.6;
        font-style: italic;
        position: relative;
        z-index: 1;
        padding-left: 15px; 
        transition: color 0.3s;
    }

     
    .nc-body {
        padding: 0 28px 32px;
        position: relative;
    }

     
    .nc-label {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        font-size: 13px; 
        font-weight: 700;
        color: var(--nc-label-text);
        background: var(--nc-label-bg);
        padding-right: 10px;
        margin-bottom: 12px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
        transition: color 0.3s, background 0.3s;
    }

    .nc-content {
        color: var(--nc-content-text);
        font-size: 1.6rem; 
        line-height: 1.75;
        transition: color 0.3s;
    }

     
    .nc-content p { margin-bottom: 1em; }
    .nc-content p:last-child { margin-bottom: 0; }
    
    .nc-content ul { padding-left: 20px; color: inherit; }
    .nc-content li { margin-bottom: 6px; }
&lt;/style&gt;
&lt;h3 id=&#34;international-contemporary-ensemble-performs-jennie-c-jones-at-the-met-国际当代乐团在纽约大都会博物馆上演珍妮c琼斯的作品&#34;&gt;International Contemporary Ensemble Performs Jennie C. Jones at The Met 国际当代乐团在纽约大都会博物馆上演珍妮·C·琼斯的作品
&lt;/h3&gt;&lt;div class=&#34;note-card&#34;&gt;
    &lt;div class=&#34;nc-accent&#34;&gt;&lt;/div&gt;

    &lt;div class=&#34;nc-header&#34;&gt;
        &lt;div class=&#34;nc-meta&#34;&gt;
            &lt;span class=&#34;nc-badge&#34;&gt;READING&lt;/span&gt;
            &lt;span class=&#34;nc-date&#34;&gt;2025-09-26&lt;/span&gt;
        &lt;/div&gt; &lt;a href=&#34;https://hyperallergic.com/1043980/international-contemporary-ensemble-performs-jennie-c-jones-the-met/&#34; target=&#34;_blank&#34; class=&#34;nc-title&#34; title=&#34;访问原文&#34;&gt;
            International Contemporary Ensemble Performs Jennie C. Jones at The Met 国际当代乐团在纽约大都会博物馆上演珍妮·C·琼斯的作品
            &lt;svg class=&#34;nc-link-icon&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
        &lt;/a&gt;
    &lt;/div&gt;

    
    &lt;div class=&#34;nc-context&#34;&gt;
        &lt;div class=&#34;nc-quote-icon&#34;&gt;“&lt;/div&gt;
        &lt;div class=&#34;nc-summary-text&#34;&gt;国际当代乐团将在大都会艺术博物馆演出艺术家 Jennie C. Jones 的作品。Jones 的艺术创作深受声音吸引，她的雕塑作品，如用音频线制成的早期作品，以及她为大都会屋顶花园创作的抽象弦乐器《Ensemble》，都体现了这一点。10月5日下午2点，乐团将演绎 Jones 的“图形乐谱”，这些纸上作品通过视觉方式探索声音。Jones 将与乐团艺术总监 George Lewis 一同探讨这些乐谱的结构，它们重新审视了极简主义，并揭示了音乐、抽象和实验之间的新联系。&lt;/div&gt;
    &lt;/div&gt;
    

    
    
    
&lt;/div&gt;

&lt;style&gt;
     
    .note-card {
         
        --nc-bg-card: #ffffff;
        --nc-border: rgba(0,0,0,0.04);
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.08);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.12);
        
        --nc-title: #2c3e50;
        --nc-title-hover: #3a7bd5;
        --nc-meta: #999999;
        
        --nc-bg-context: #f8f9fa;
        --nc-border-context: #e2e8f0;
        --nc-quote-icon: #e2e8f0;
        --nc-text-summary: #555555;
        
        --nc-label-bg: #ffffff;
        --nc-label-text: #2d3748;
        --nc-content-text: #2d3748;
        --nc-link-icon: #cbd5e0;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.1);
        --nc-badge-text: #3a7bd5;

        position: relative;
        background: var(--nc-bg-card);
        border-radius: 12px;
        box-shadow: var(--nc-shadow);
        margin: 2.5rem 0;
        overflow: hidden;
        border: 1px solid var(--nc-border);
        font-family: inherit; 
        transition: transform 0.3s ease, box-shadow 0.3s ease, background 0.3s, border-color 0.3s;
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .note-card {
            --nc-bg-card: #1e1e1e;
            --nc-border: #333333;
            --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
            --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
            
            --nc-title: #f0f0f0;
            --nc-meta: #999999;
            
            --nc-bg-context: #252525;
            --nc-border-context: #444444;
            --nc-quote-icon: #333333;
            --nc-text-summary: #aaaaaa;
            
            --nc-label-bg: #1e1e1e;
            --nc-label-text: #cccccc;
            --nc-content-text: #dddddd;
            --nc-link-icon: #666666;
            
            --nc-badge-bg: rgba(58, 123, 213, 0.2);
        }
    }

    html[data-scheme=&#34;dark&#34;] .note-card {
        --nc-bg-card: #1e1e1e;
        --nc-border: #333333;
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
        
        --nc-title: #f0f0f0;
        --nc-meta: #999999;
        
        --nc-bg-context: #252525;
        --nc-border-context: #444444;
        --nc-quote-icon: #333333;
        --nc-text-summary: #aaaaaa;
        
        --nc-label-bg: #1e1e1e;
        --nc-label-text: #cccccc;
        --nc-content-text: #dddddd;
        --nc-link-icon: #666666;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.2);
    }

    .note-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--nc-shadow-hover);
    }

     
    .nc-accent {
        height: 4px;
        background: linear-gradient(90deg, #3a7bd5, #00d2ff); 
        width: 100%;
    }

     
    .nc-header {
        padding: 24px 28px 10px; 
    }

    .nc-meta {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 10px; 
        font-size: 13px; 
        color: var(--nc-meta);
        font-weight: 600;
        letter-spacing: 1px;
        text-transform: uppercase;
    }

    .nc-badge {
        color: var(--nc-badge-text);
        background: var(--nc-badge-bg);
        padding: 2px 6px;
        border-radius: 4px;
    }

    .nc-title {
        display: block;
        font-size: 2rem; 
        font-weight: 700;
        color: var(--nc-title);
        text-decoration: none;
        line-height: 1.3;
        transition: color 0.2s;
    }

    .nc-title:hover {
        color: var(--nc-title-hover);
    }

    .nc-link-icon {
        width: 20px; 
        height: 20px;
        color: var(--nc-link-icon);
        margin-left: 5px;
        vertical-align: middle;
        transition: color 0.2s;
    }

    .nc-title:hover .nc-link-icon {
        color: var(--nc-title-hover);
    }

     
    .nc-context {
        margin: 12px 28px 24px;
        background: var(--nc-bg-context);
        padding: 20px 24px;
        border-radius: 8px;
        position: relative;
        border-left: 4px solid var(--nc-border-context);
        transition: background 0.3s, border-color 0.3s;
    }

    .nc-quote-icon {
        position: absolute;
        top: 8px;
        left: 10px;
        font-family: serif; 
        font-size: 40px;
        line-height: 1;
        color: var(--nc-quote-icon);
        pointer-events: none;
        transition: color 0.3s;
    }

    .nc-summary-text {
        font-size: 1.7rem; 
        color: var(--nc-text-summary);
        line-height: 1.6;
        font-style: italic;
        position: relative;
        z-index: 1;
        padding-left: 15px; 
        transition: color 0.3s;
    }

     
    .nc-body {
        padding: 0 28px 32px;
        position: relative;
    }

     
    .nc-label {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        font-size: 13px; 
        font-weight: 700;
        color: var(--nc-label-text);
        background: var(--nc-label-bg);
        padding-right: 10px;
        margin-bottom: 12px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
        transition: color 0.3s, background 0.3s;
    }

    .nc-content {
        color: var(--nc-content-text);
        font-size: 1.6rem; 
        line-height: 1.75;
        transition: color 0.3s;
    }

     
    .nc-content p { margin-bottom: 1em; }
    .nc-content p:last-child { margin-bottom: 0; }
    
    .nc-content ul { padding-left: 20px; color: inherit; }
    .nc-content li { margin-bottom: 6px; }
&lt;/style&gt;
&lt;h3 id=&#34;the-shadow-of-desire-painting-the-origins-of-art-ca-16251850-欲望之影艺术起源的描绘约16251850年&#34;&gt;The Shadow of Desire: Painting the Origins of Art (Ca. 1625–1850) 欲望之影：艺术起源的描绘（约1625–1850年）
&lt;/h3&gt;&lt;div class=&#34;note-card&#34;&gt;
    &lt;div class=&#34;nc-accent&#34;&gt;&lt;/div&gt;

    &lt;div class=&#34;nc-header&#34;&gt;
        &lt;div class=&#34;nc-meta&#34;&gt;
            &lt;span class=&#34;nc-badge&#34;&gt;READING&lt;/span&gt;
            &lt;span class=&#34;nc-date&#34;&gt;2025-09-26&lt;/span&gt;
        &lt;/div&gt; &lt;a href=&#34;https://publicdomainreview.org/collection/origins-of-painting&#34; target=&#34;_blank&#34; class=&#34;nc-title&#34; title=&#34;访问原文&#34;&gt;
            The Shadow of Desire: Painting the Origins of Art (Ca. 1625–1850) 欲望之影：艺术起源的描绘（约1625–1850年）
            &lt;svg class=&#34;nc-link-icon&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
        &lt;/a&gt;
    &lt;/div&gt;

    
    &lt;div class=&#34;nc-context&#34;&gt;
        &lt;div class=&#34;nc-quote-icon&#34;&gt;“&lt;/div&gt;
        &lt;div class=&#34;nc-summary-text&#34;&gt;描绘普林尼（Pliny the Elder）关于艺术起源的记述的绘画。&lt;/div&gt;
    &lt;/div&gt;
    

    
    
    
&lt;/div&gt;

&lt;style&gt;
     
    .note-card {
         
        --nc-bg-card: #ffffff;
        --nc-border: rgba(0,0,0,0.04);
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.08);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.12);
        
        --nc-title: #2c3e50;
        --nc-title-hover: #3a7bd5;
        --nc-meta: #999999;
        
        --nc-bg-context: #f8f9fa;
        --nc-border-context: #e2e8f0;
        --nc-quote-icon: #e2e8f0;
        --nc-text-summary: #555555;
        
        --nc-label-bg: #ffffff;
        --nc-label-text: #2d3748;
        --nc-content-text: #2d3748;
        --nc-link-icon: #cbd5e0;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.1);
        --nc-badge-text: #3a7bd5;

        position: relative;
        background: var(--nc-bg-card);
        border-radius: 12px;
        box-shadow: var(--nc-shadow);
        margin: 2.5rem 0;
        overflow: hidden;
        border: 1px solid var(--nc-border);
        font-family: inherit; 
        transition: transform 0.3s ease, box-shadow 0.3s ease, background 0.3s, border-color 0.3s;
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .note-card {
            --nc-bg-card: #1e1e1e;
            --nc-border: #333333;
            --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
            --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
            
            --nc-title: #f0f0f0;
            --nc-meta: #999999;
            
            --nc-bg-context: #252525;
            --nc-border-context: #444444;
            --nc-quote-icon: #333333;
            --nc-text-summary: #aaaaaa;
            
            --nc-label-bg: #1e1e1e;
            --nc-label-text: #cccccc;
            --nc-content-text: #dddddd;
            --nc-link-icon: #666666;
            
            --nc-badge-bg: rgba(58, 123, 213, 0.2);
        }
    }

    html[data-scheme=&#34;dark&#34;] .note-card {
        --nc-bg-card: #1e1e1e;
        --nc-border: #333333;
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
        
        --nc-title: #f0f0f0;
        --nc-meta: #999999;
        
        --nc-bg-context: #252525;
        --nc-border-context: #444444;
        --nc-quote-icon: #333333;
        --nc-text-summary: #aaaaaa;
        
        --nc-label-bg: #1e1e1e;
        --nc-label-text: #cccccc;
        --nc-content-text: #dddddd;
        --nc-link-icon: #666666;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.2);
    }

    .note-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--nc-shadow-hover);
    }

     
    .nc-accent {
        height: 4px;
        background: linear-gradient(90deg, #3a7bd5, #00d2ff); 
        width: 100%;
    }

     
    .nc-header {
        padding: 24px 28px 10px; 
    }

    .nc-meta {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 10px; 
        font-size: 13px; 
        color: var(--nc-meta);
        font-weight: 600;
        letter-spacing: 1px;
        text-transform: uppercase;
    }

    .nc-badge {
        color: var(--nc-badge-text);
        background: var(--nc-badge-bg);
        padding: 2px 6px;
        border-radius: 4px;
    }

    .nc-title {
        display: block;
        font-size: 2rem; 
        font-weight: 700;
        color: var(--nc-title);
        text-decoration: none;
        line-height: 1.3;
        transition: color 0.2s;
    }

    .nc-title:hover {
        color: var(--nc-title-hover);
    }

    .nc-link-icon {
        width: 20px; 
        height: 20px;
        color: var(--nc-link-icon);
        margin-left: 5px;
        vertical-align: middle;
        transition: color 0.2s;
    }

    .nc-title:hover .nc-link-icon {
        color: var(--nc-title-hover);
    }

     
    .nc-context {
        margin: 12px 28px 24px;
        background: var(--nc-bg-context);
        padding: 20px 24px;
        border-radius: 8px;
        position: relative;
        border-left: 4px solid var(--nc-border-context);
        transition: background 0.3s, border-color 0.3s;
    }

    .nc-quote-icon {
        position: absolute;
        top: 8px;
        left: 10px;
        font-family: serif; 
        font-size: 40px;
        line-height: 1;
        color: var(--nc-quote-icon);
        pointer-events: none;
        transition: color 0.3s;
    }

    .nc-summary-text {
        font-size: 1.7rem; 
        color: var(--nc-text-summary);
        line-height: 1.6;
        font-style: italic;
        position: relative;
        z-index: 1;
        padding-left: 15px; 
        transition: color 0.3s;
    }

     
    .nc-body {
        padding: 0 28px 32px;
        position: relative;
    }

     
    .nc-label {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        font-size: 13px; 
        font-weight: 700;
        color: var(--nc-label-text);
        background: var(--nc-label-bg);
        padding-right: 10px;
        margin-bottom: 12px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
        transition: color 0.3s, background 0.3s;
    }

    .nc-content {
        color: var(--nc-content-text);
        font-size: 1.6rem; 
        line-height: 1.75;
        transition: color 0.3s;
    }

     
    .nc-content p { margin-bottom: 1em; }
    .nc-content p:last-child { margin-bottom: 0; }
    
    .nc-content ul { padding-left: 20px; color: inherit; }
    .nc-content li { margin-bottom: 6px; }
&lt;/style&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-13&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        It’s a strange story，to say the least. Is there a moral here regarding desire and grief? A proto-psychoanalytic parable about how the outlines of our lovers get filled in — and hardened — with models set by our parents? Or is this a tale about eros and art，the way desire transforms clay and shadow into a sumptuous aesthetic experience? To expand Rousseau’s claim in the Essay on the Origin of Languages，love was not only “the inventor of drawing” but also our impetus for mimesis in three dimensions. “Pliny’s tale presents that mythic moment when imminent loss drives the impulse to record and remember”，writes Liza Saltzman.
    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-13&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-14&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        In Pliny’s time，Kora’s act of tracing may have been overshadowed，as it were，with the cluster of associations swirling around the word eidolon，which，according to Hagi Kenaan，“held together the symbolic connection among images，shadows，phantom phenomena，apparitions of the dead，and dreams”. With this in mind，we glimpse the darker side of the Butades motif in Joseph Benoît Suvée’s Invention of the Art of Drawing，debuted at the Paris Salon of 1791. Here，the male lover is all-too-awake，grasping Kora’s waist and looking up at the source of his desire while she remains unmoved. Her attention is completely absorbed in representation: the promise held by the shadow seems to have displaced any interest in unmediated，light-drenched life. The man’s agony is perhaps less about sex，more about death. “A Greek understood his shadow as a premonition of his shadowy existence in the underworld”，writes Hans Belting，“when he would no longer be able to cast a shadow but would himself be a mere shadow.” Kora’s lover becomes a kind of Galatea，and she，a necromantic Pygmalion，but instead of infusing the inanimate with life，the living seems to become consigned to the shadow realm by her steady hand.
    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-14&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-15&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        And perhaps there is another sense of afterlife and survival at work behind the scenes. George Didi-Huberman has demonstrated how these secular images of representation have a predecessor in Christian icons known as acheiropoieton (made without hands)，like the Manoppelo Image and the Holy Shroud of Turin，miraculously emblazoned with the face of Jesus Christ，as if his shadow could leave a stain. “What has touched the god often becomes untouchable par excellence”，he writes，“it withdraws into the shadow of the mystery (and is constituted forever as an object of desire).” A similar process seems at play in the images collected here，which are themselves comprised of what Aby Warburg called survivals: the “knot of anachronisms” that endure in images and their heterogeneous debts to ancient cultural worlds. The male lover may see a premonition of his own shadowy fate cast upon the wall，yet he is also witnessing the creation of an image that will no longer follow him，as his shadow does，but have a unique afterlife all its own. (According to Pliny，Butades’ clay model was preserved in a nymphaeum in Corinth for centuries，until its wartime destruction in the second century BCE.)
    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-15&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;
&lt;h3 id=&#34;the-new-mccarthyism-on-canary-missions-toxic-blacklisting-of-pro-palestinian-sentiment-新麦卡锡主义论金丝雀任务对亲巴勒斯坦情绪的恶毒黑名单&#34;&gt;The New McCarthyism: On Canary Mission’s Toxic Blacklisting of Pro-Palestinian Sentiment 新麦卡锡主义：论“金丝雀任务”对亲巴勒斯坦情绪的恶毒黑名单
&lt;/h3&gt;&lt;div class=&#34;note-card&#34;&gt;
    &lt;div class=&#34;nc-accent&#34;&gt;&lt;/div&gt;

    &lt;div class=&#34;nc-header&#34;&gt;
        &lt;div class=&#34;nc-meta&#34;&gt;
            &lt;span class=&#34;nc-badge&#34;&gt;READING&lt;/span&gt;
            &lt;span class=&#34;nc-date&#34;&gt;2025-09-26&lt;/span&gt;
        &lt;/div&gt; &lt;a href=&#34;https://lithub.com/the-new-mccarthyism-on-canary-missions-toxic-blacklisting-of-pro-palestinian-sentiment/&#34; target=&#34;_blank&#34; class=&#34;nc-title&#34; title=&#34;访问原文&#34;&gt;
            The New McCarthyism: On Canary Mission’s Toxic Blacklisting of Pro-Palestinian Sentiment 新麦卡锡主义：论“金丝雀任务”对亲巴勒斯坦情绪的恶毒黑名单
            &lt;svg class=&#34;nc-link-icon&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
        &lt;/a&gt;
    &lt;/div&gt;

    
    &lt;div class=&#34;nc-context&#34;&gt;
        &lt;div class=&#34;nc-quote-icon&#34;&gt;“&lt;/div&gt;
        &lt;div class=&#34;nc-summary-text&#34;&gt;文章指出，“金丝雀使命”（Canary Mission）等网站通过匿名列出支持巴勒斯坦的学生和学者，对其进行“黑名单”式的诋毁，企图阻止其获得就业机会，并压制对巴勒斯坦权利的倡导。这种做法被比作“新麦卡锡主义”，是“数字殖民主义”的一种表现，旨在将批评以色列等同于反犹主义，从而阻止对巴勒斯坦解放问题的实质性讨论。作者认为，这种策略不仅影响个体的生计和心理健康，也是对数字空间的一种殖民，试图消除对巴勒斯坦自由的支持的任何痕迹。&lt;/div&gt;
    &lt;/div&gt;
    

    
    
    
&lt;/div&gt;

&lt;style&gt;
     
    .note-card {
         
        --nc-bg-card: #ffffff;
        --nc-border: rgba(0,0,0,0.04);
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.08);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.12);
        
        --nc-title: #2c3e50;
        --nc-title-hover: #3a7bd5;
        --nc-meta: #999999;
        
        --nc-bg-context: #f8f9fa;
        --nc-border-context: #e2e8f0;
        --nc-quote-icon: #e2e8f0;
        --nc-text-summary: #555555;
        
        --nc-label-bg: #ffffff;
        --nc-label-text: #2d3748;
        --nc-content-text: #2d3748;
        --nc-link-icon: #cbd5e0;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.1);
        --nc-badge-text: #3a7bd5;

        position: relative;
        background: var(--nc-bg-card);
        border-radius: 12px;
        box-shadow: var(--nc-shadow);
        margin: 2.5rem 0;
        overflow: hidden;
        border: 1px solid var(--nc-border);
        font-family: inherit; 
        transition: transform 0.3s ease, box-shadow 0.3s ease, background 0.3s, border-color 0.3s;
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .note-card {
            --nc-bg-card: #1e1e1e;
            --nc-border: #333333;
            --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
            --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
            
            --nc-title: #f0f0f0;
            --nc-meta: #999999;
            
            --nc-bg-context: #252525;
            --nc-border-context: #444444;
            --nc-quote-icon: #333333;
            --nc-text-summary: #aaaaaa;
            
            --nc-label-bg: #1e1e1e;
            --nc-label-text: #cccccc;
            --nc-content-text: #dddddd;
            --nc-link-icon: #666666;
            
            --nc-badge-bg: rgba(58, 123, 213, 0.2);
        }
    }

    html[data-scheme=&#34;dark&#34;] .note-card {
        --nc-bg-card: #1e1e1e;
        --nc-border: #333333;
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
        
        --nc-title: #f0f0f0;
        --nc-meta: #999999;
        
        --nc-bg-context: #252525;
        --nc-border-context: #444444;
        --nc-quote-icon: #333333;
        --nc-text-summary: #aaaaaa;
        
        --nc-label-bg: #1e1e1e;
        --nc-label-text: #cccccc;
        --nc-content-text: #dddddd;
        --nc-link-icon: #666666;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.2);
    }

    .note-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--nc-shadow-hover);
    }

     
    .nc-accent {
        height: 4px;
        background: linear-gradient(90deg, #3a7bd5, #00d2ff); 
        width: 100%;
    }

     
    .nc-header {
        padding: 24px 28px 10px; 
    }

    .nc-meta {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 10px; 
        font-size: 13px; 
        color: var(--nc-meta);
        font-weight: 600;
        letter-spacing: 1px;
        text-transform: uppercase;
    }

    .nc-badge {
        color: var(--nc-badge-text);
        background: var(--nc-badge-bg);
        padding: 2px 6px;
        border-radius: 4px;
    }

    .nc-title {
        display: block;
        font-size: 2rem; 
        font-weight: 700;
        color: var(--nc-title);
        text-decoration: none;
        line-height: 1.3;
        transition: color 0.2s;
    }

    .nc-title:hover {
        color: var(--nc-title-hover);
    }

    .nc-link-icon {
        width: 20px; 
        height: 20px;
        color: var(--nc-link-icon);
        margin-left: 5px;
        vertical-align: middle;
        transition: color 0.2s;
    }

    .nc-title:hover .nc-link-icon {
        color: var(--nc-title-hover);
    }

     
    .nc-context {
        margin: 12px 28px 24px;
        background: var(--nc-bg-context);
        padding: 20px 24px;
        border-radius: 8px;
        position: relative;
        border-left: 4px solid var(--nc-border-context);
        transition: background 0.3s, border-color 0.3s;
    }

    .nc-quote-icon {
        position: absolute;
        top: 8px;
        left: 10px;
        font-family: serif; 
        font-size: 40px;
        line-height: 1;
        color: var(--nc-quote-icon);
        pointer-events: none;
        transition: color 0.3s;
    }

    .nc-summary-text {
        font-size: 1.7rem; 
        color: var(--nc-text-summary);
        line-height: 1.6;
        font-style: italic;
        position: relative;
        z-index: 1;
        padding-left: 15px; 
        transition: color 0.3s;
    }

     
    .nc-body {
        padding: 0 28px 32px;
        position: relative;
    }

     
    .nc-label {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        font-size: 13px; 
        font-weight: 700;
        color: var(--nc-label-text);
        background: var(--nc-label-bg);
        padding-right: 10px;
        margin-bottom: 12px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
        transition: color 0.3s, background 0.3s;
    }

    .nc-content {
        color: var(--nc-content-text);
        font-size: 1.6rem; 
        line-height: 1.75;
        transition: color 0.3s;
    }

     
    .nc-content p { margin-bottom: 1em; }
    .nc-content p:last-child { margin-bottom: 0; }
    
    .nc-content ul { padding-left: 20px; color: inherit; }
    .nc-content li { margin-bottom: 6px; }
&lt;/style&gt;
&lt;h3 id=&#34;有一种字体叫上海摩登体全套字体均可下载应用&#34;&gt;有一种字体叫“上海摩登体”，全套字体均可下载应用
&lt;/h3&gt;&lt;div class=&#34;note-card&#34;&gt;
    &lt;div class=&#34;nc-accent&#34;&gt;&lt;/div&gt;

    &lt;div class=&#34;nc-header&#34;&gt;
        &lt;div class=&#34;nc-meta&#34;&gt;
            &lt;span class=&#34;nc-badge&#34;&gt;READING&lt;/span&gt;
            &lt;span class=&#34;nc-date&#34;&gt;2025-09-26&lt;/span&gt;
        &lt;/div&gt; &lt;a href=&#34;https://m.thepaper.cn/detail/31672794&#34; target=&#34;_blank&#34; class=&#34;nc-title&#34; title=&#34;访问原文&#34;&gt;
            有一种字体叫“上海摩登体”，全套字体均可下载应用
            &lt;svg class=&#34;nc-link-icon&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
        &lt;/a&gt;
    &lt;/div&gt;

    
    &lt;div class=&#34;nc-context&#34;&gt;
        &lt;div class=&#34;nc-quote-icon&#34;&gt;“&lt;/div&gt;
        &lt;div class=&#34;nc-summary-text&#34;&gt;中国首款以城市文化为源流的中西文字体“上海摩登体”已正式发布，并向社会开源共享。该字体库汲取1930至1940年代上海装饰艺术风格，融合中西文，兼具建筑感与动态美，并已推出艺术海报展览。字体设计旨在彰显上海的城市精神与文化底蕴，并已应用于上海多个城市空间和活动中，未来可广泛应用于城市标识、文创产品等多个场景。&lt;/div&gt;
    &lt;/div&gt;
    

    
    
    
&lt;/div&gt;

&lt;style&gt;
     
    .note-card {
         
        --nc-bg-card: #ffffff;
        --nc-border: rgba(0,0,0,0.04);
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.08);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.12);
        
        --nc-title: #2c3e50;
        --nc-title-hover: #3a7bd5;
        --nc-meta: #999999;
        
        --nc-bg-context: #f8f9fa;
        --nc-border-context: #e2e8f0;
        --nc-quote-icon: #e2e8f0;
        --nc-text-summary: #555555;
        
        --nc-label-bg: #ffffff;
        --nc-label-text: #2d3748;
        --nc-content-text: #2d3748;
        --nc-link-icon: #cbd5e0;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.1);
        --nc-badge-text: #3a7bd5;

        position: relative;
        background: var(--nc-bg-card);
        border-radius: 12px;
        box-shadow: var(--nc-shadow);
        margin: 2.5rem 0;
        overflow: hidden;
        border: 1px solid var(--nc-border);
        font-family: inherit; 
        transition: transform 0.3s ease, box-shadow 0.3s ease, background 0.3s, border-color 0.3s;
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .note-card {
            --nc-bg-card: #1e1e1e;
            --nc-border: #333333;
            --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
            --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
            
            --nc-title: #f0f0f0;
            --nc-meta: #999999;
            
            --nc-bg-context: #252525;
            --nc-border-context: #444444;
            --nc-quote-icon: #333333;
            --nc-text-summary: #aaaaaa;
            
            --nc-label-bg: #1e1e1e;
            --nc-label-text: #cccccc;
            --nc-content-text: #dddddd;
            --nc-link-icon: #666666;
            
            --nc-badge-bg: rgba(58, 123, 213, 0.2);
        }
    }

    html[data-scheme=&#34;dark&#34;] .note-card {
        --nc-bg-card: #1e1e1e;
        --nc-border: #333333;
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
        
        --nc-title: #f0f0f0;
        --nc-meta: #999999;
        
        --nc-bg-context: #252525;
        --nc-border-context: #444444;
        --nc-quote-icon: #333333;
        --nc-text-summary: #aaaaaa;
        
        --nc-label-bg: #1e1e1e;
        --nc-label-text: #cccccc;
        --nc-content-text: #dddddd;
        --nc-link-icon: #666666;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.2);
    }

    .note-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--nc-shadow-hover);
    }

     
    .nc-accent {
        height: 4px;
        background: linear-gradient(90deg, #3a7bd5, #00d2ff); 
        width: 100%;
    }

     
    .nc-header {
        padding: 24px 28px 10px; 
    }

    .nc-meta {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 10px; 
        font-size: 13px; 
        color: var(--nc-meta);
        font-weight: 600;
        letter-spacing: 1px;
        text-transform: uppercase;
    }

    .nc-badge {
        color: var(--nc-badge-text);
        background: var(--nc-badge-bg);
        padding: 2px 6px;
        border-radius: 4px;
    }

    .nc-title {
        display: block;
        font-size: 2rem; 
        font-weight: 700;
        color: var(--nc-title);
        text-decoration: none;
        line-height: 1.3;
        transition: color 0.2s;
    }

    .nc-title:hover {
        color: var(--nc-title-hover);
    }

    .nc-link-icon {
        width: 20px; 
        height: 20px;
        color: var(--nc-link-icon);
        margin-left: 5px;
        vertical-align: middle;
        transition: color 0.2s;
    }

    .nc-title:hover .nc-link-icon {
        color: var(--nc-title-hover);
    }

     
    .nc-context {
        margin: 12px 28px 24px;
        background: var(--nc-bg-context);
        padding: 20px 24px;
        border-radius: 8px;
        position: relative;
        border-left: 4px solid var(--nc-border-context);
        transition: background 0.3s, border-color 0.3s;
    }

    .nc-quote-icon {
        position: absolute;
        top: 8px;
        left: 10px;
        font-family: serif; 
        font-size: 40px;
        line-height: 1;
        color: var(--nc-quote-icon);
        pointer-events: none;
        transition: color 0.3s;
    }

    .nc-summary-text {
        font-size: 1.7rem; 
        color: var(--nc-text-summary);
        line-height: 1.6;
        font-style: italic;
        position: relative;
        z-index: 1;
        padding-left: 15px; 
        transition: color 0.3s;
    }

     
    .nc-body {
        padding: 0 28px 32px;
        position: relative;
    }

     
    .nc-label {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        font-size: 13px; 
        font-weight: 700;
        color: var(--nc-label-text);
        background: var(--nc-label-bg);
        padding-right: 10px;
        margin-bottom: 12px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
        transition: color 0.3s, background 0.3s;
    }

    .nc-content {
        color: var(--nc-content-text);
        font-size: 1.6rem; 
        line-height: 1.75;
        transition: color 0.3s;
    }

     
    .nc-content p { margin-bottom: 1em; }
    .nc-content p:last-child { margin-bottom: 0; }
    
    .nc-content ul { padding-left: 20px; color: inherit; }
    .nc-content li { margin-bottom: 6px; }
&lt;/style&gt;
&lt;h3 id=&#34;hand-holding-trump-and-epstein-statue-appears-on-national-mall-特朗普和爱泼斯坦的牵手雕像出现在国家广场&#34;&gt;Hand-Holding Trump and Epstein Statue Appears on National Mall 特朗普和爱泼斯坦的牵手雕像出现在国家广场
&lt;/h3&gt;&lt;div class=&#34;note-card&#34;&gt;
    &lt;div class=&#34;nc-accent&#34;&gt;&lt;/div&gt;

    &lt;div class=&#34;nc-header&#34;&gt;
        &lt;div class=&#34;nc-meta&#34;&gt;
            &lt;span class=&#34;nc-badge&#34;&gt;READING&lt;/span&gt;
            &lt;span class=&#34;nc-date&#34;&gt;2025-09-26&lt;/span&gt;
        &lt;/div&gt; &lt;a href=&#34;https://hyperallergic.com/1044357/hand-holding-trump-and-epstein-statue-appears-on-national-mall/&#34; target=&#34;_blank&#34; class=&#34;nc-title&#34; title=&#34;访问原文&#34;&gt;
            Hand-Holding Trump and Epstein Statue Appears on National Mall 特朗普和爱泼斯坦的牵手雕像出现在国家广场
            &lt;svg class=&#34;nc-link-icon&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
        &lt;/a&gt;
    &lt;/div&gt;

    
    &lt;div class=&#34;nc-context&#34;&gt;
        &lt;div class=&#34;nc-quote-icon&#34;&gt;“&lt;/div&gt;
        &lt;div class=&#34;nc-summary-text&#34;&gt;华盛顿特区国家广场上出现了一座特朗普总统和性犯罪者杰弗里·爱泼斯坦牵手的雕像，以“友谊月”的名义，讽刺两人之间的“友谊”。这座12英尺高的雕像由匿名团体“The Secret Handshake”创作，上面刻有特朗普写给爱泼斯坦的生日书信摘录，包括“生活中一定有比拥有一切更重要的东西”。然而，该雕像在展出一天后就被美国公园警察移除，理由是“不符合发放的许可证”。此事件正值美国就爱泼斯坦相关文件展开政治辩论之际，也是对特朗普及其政治盟友进行讽刺性艺术创作系列的一部分。&lt;/div&gt;
    &lt;/div&gt;
    

    
    
    
&lt;/div&gt;

&lt;style&gt;
     
    .note-card {
         
        --nc-bg-card: #ffffff;
        --nc-border: rgba(0,0,0,0.04);
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.08);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.12);
        
        --nc-title: #2c3e50;
        --nc-title-hover: #3a7bd5;
        --nc-meta: #999999;
        
        --nc-bg-context: #f8f9fa;
        --nc-border-context: #e2e8f0;
        --nc-quote-icon: #e2e8f0;
        --nc-text-summary: #555555;
        
        --nc-label-bg: #ffffff;
        --nc-label-text: #2d3748;
        --nc-content-text: #2d3748;
        --nc-link-icon: #cbd5e0;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.1);
        --nc-badge-text: #3a7bd5;

        position: relative;
        background: var(--nc-bg-card);
        border-radius: 12px;
        box-shadow: var(--nc-shadow);
        margin: 2.5rem 0;
        overflow: hidden;
        border: 1px solid var(--nc-border);
        font-family: inherit; 
        transition: transform 0.3s ease, box-shadow 0.3s ease, background 0.3s, border-color 0.3s;
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .note-card {
            --nc-bg-card: #1e1e1e;
            --nc-border: #333333;
            --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
            --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
            
            --nc-title: #f0f0f0;
            --nc-meta: #999999;
            
            --nc-bg-context: #252525;
            --nc-border-context: #444444;
            --nc-quote-icon: #333333;
            --nc-text-summary: #aaaaaa;
            
            --nc-label-bg: #1e1e1e;
            --nc-label-text: #cccccc;
            --nc-content-text: #dddddd;
            --nc-link-icon: #666666;
            
            --nc-badge-bg: rgba(58, 123, 213, 0.2);
        }
    }

    html[data-scheme=&#34;dark&#34;] .note-card {
        --nc-bg-card: #1e1e1e;
        --nc-border: #333333;
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
        
        --nc-title: #f0f0f0;
        --nc-meta: #999999;
        
        --nc-bg-context: #252525;
        --nc-border-context: #444444;
        --nc-quote-icon: #333333;
        --nc-text-summary: #aaaaaa;
        
        --nc-label-bg: #1e1e1e;
        --nc-label-text: #cccccc;
        --nc-content-text: #dddddd;
        --nc-link-icon: #666666;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.2);
    }

    .note-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--nc-shadow-hover);
    }

     
    .nc-accent {
        height: 4px;
        background: linear-gradient(90deg, #3a7bd5, #00d2ff); 
        width: 100%;
    }

     
    .nc-header {
        padding: 24px 28px 10px; 
    }

    .nc-meta {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 10px; 
        font-size: 13px; 
        color: var(--nc-meta);
        font-weight: 600;
        letter-spacing: 1px;
        text-transform: uppercase;
    }

    .nc-badge {
        color: var(--nc-badge-text);
        background: var(--nc-badge-bg);
        padding: 2px 6px;
        border-radius: 4px;
    }

    .nc-title {
        display: block;
        font-size: 2rem; 
        font-weight: 700;
        color: var(--nc-title);
        text-decoration: none;
        line-height: 1.3;
        transition: color 0.2s;
    }

    .nc-title:hover {
        color: var(--nc-title-hover);
    }

    .nc-link-icon {
        width: 20px; 
        height: 20px;
        color: var(--nc-link-icon);
        margin-left: 5px;
        vertical-align: middle;
        transition: color 0.2s;
    }

    .nc-title:hover .nc-link-icon {
        color: var(--nc-title-hover);
    }

     
    .nc-context {
        margin: 12px 28px 24px;
        background: var(--nc-bg-context);
        padding: 20px 24px;
        border-radius: 8px;
        position: relative;
        border-left: 4px solid var(--nc-border-context);
        transition: background 0.3s, border-color 0.3s;
    }

    .nc-quote-icon {
        position: absolute;
        top: 8px;
        left: 10px;
        font-family: serif; 
        font-size: 40px;
        line-height: 1;
        color: var(--nc-quote-icon);
        pointer-events: none;
        transition: color 0.3s;
    }

    .nc-summary-text {
        font-size: 1.7rem; 
        color: var(--nc-text-summary);
        line-height: 1.6;
        font-style: italic;
        position: relative;
        z-index: 1;
        padding-left: 15px; 
        transition: color 0.3s;
    }

     
    .nc-body {
        padding: 0 28px 32px;
        position: relative;
    }

     
    .nc-label {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        font-size: 13px; 
        font-weight: 700;
        color: var(--nc-label-text);
        background: var(--nc-label-bg);
        padding-right: 10px;
        margin-bottom: 12px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
        transition: color 0.3s, background 0.3s;
    }

    .nc-content {
        color: var(--nc-content-text);
        font-size: 1.6rem; 
        line-height: 1.75;
        transition: color 0.3s;
    }

     
    .nc-content p { margin-bottom: 1em; }
    .nc-content p:last-child { margin-bottom: 0; }
    
    .nc-content ul { padding-left: 20px; color: inherit; }
    .nc-content li { margin-bottom: 6px; }
&lt;/style&gt;
&lt;p&gt;&lt;img src=&#34;https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A2025%E5%B9%B4%E7%AC%AC29-30%E6%9C%9F%E5%90%88%E5%88%8A%E6%80%BB%E7%AC%AC29-30%E6%9C%9F/20250926-Picture01.jpg&#34;
	width=&#34;1024&#34;
	height=&#34;683&#34;
	srcset=&#34;https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A2025%E5%B9%B4%E7%AC%AC29-30%E6%9C%9F%E5%90%88%E5%88%8A%E6%80%BB%E7%AC%AC29-30%E6%9C%9F/20250926-Picture01_hu_8b4f407d0dd4a847.jpg 480w, https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A2025%E5%B9%B4%E7%AC%AC29-30%E6%9C%9F%E5%90%88%E5%88%8A%E6%80%BB%E7%AC%AC29-30%E6%9C%9F/20250926-Picture01_hu_bd6a887bc480500b.jpg 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;一座美国总统唐纳德·特朗普和被判犯有性犯罪的杰弗里·爱泼斯坦牵手雕像于9月23日星期二神秘地出现在华盛顿特区的国家广场。这座匿名纪念碑被誉为对两人在“友情月”期间密切联盟的幽默致敬，此前几周，国会民主党人公布了一本据称是在爱泼斯坦2003年50岁生日时赠送给他的生日剪贴簿。&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;149&#34;
		data-flex-basis=&#34;359px&#34;
	
&gt;&lt;/p&gt;
&lt;h3 id=&#34;the-visual-pleasures-of-art-therapy-视觉的愉悦艺术疗法&#34;&gt;The Visual Pleasures of Art Therapy 视觉的愉悦：艺术疗法
&lt;/h3&gt;&lt;div class=&#34;note-card&#34;&gt;
    &lt;div class=&#34;nc-accent&#34;&gt;&lt;/div&gt;

    &lt;div class=&#34;nc-header&#34;&gt;
        &lt;div class=&#34;nc-meta&#34;&gt;
            &lt;span class=&#34;nc-badge&#34;&gt;READING&lt;/span&gt;
            &lt;span class=&#34;nc-date&#34;&gt;2025-09-26&lt;/span&gt;
        &lt;/div&gt; &lt;a href=&#34;https://hyperallergic.com/1044028/the-visual-pleasures-of-art-therapy-house-tree-person/&#34; target=&#34;_blank&#34; class=&#34;nc-title&#34; title=&#34;访问原文&#34;&gt;
            The Visual Pleasures of Art Therapy 视觉的愉悦：艺术疗法
            &lt;svg class=&#34;nc-link-icon&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
        &lt;/a&gt;
    &lt;/div&gt;

    
    &lt;div class=&#34;nc-context&#34;&gt;
        &lt;div class=&#34;nc-quote-icon&#34;&gt;“&lt;/div&gt;
        &lt;div class=&#34;nc-summary-text&#34;&gt;纽约BlankMag Books正在展出名为“房-树-人（群体版）”的展览，由治疗师Daniel Soprano和艺术家Jesus Antonio联合策展。该展览灵感来源于心理学中的“房-树-人”投射测验，该测验旨在揭示个体对自我、家庭和人际关系的潜意识感受。Soprano邀请了15位艺术家，以其独特视角重新诠释这一测验提示。展览作品风格各异，有的色彩鲜艳，有的抽象，有的充满细节，展现了艺术家们对“房-树-人”概念的多样化理解。策展人认为，该测验的灵活性使其非常适合群体展览。展览作品以统一的画框呈现，并以垂直顺序排列。部分展览收益将捐赠给美国艺术治疗协会。&lt;/div&gt;
    &lt;/div&gt;
    

    
    
    
&lt;/div&gt;

&lt;style&gt;
     
    .note-card {
         
        --nc-bg-card: #ffffff;
        --nc-border: rgba(0,0,0,0.04);
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.08);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.12);
        
        --nc-title: #2c3e50;
        --nc-title-hover: #3a7bd5;
        --nc-meta: #999999;
        
        --nc-bg-context: #f8f9fa;
        --nc-border-context: #e2e8f0;
        --nc-quote-icon: #e2e8f0;
        --nc-text-summary: #555555;
        
        --nc-label-bg: #ffffff;
        --nc-label-text: #2d3748;
        --nc-content-text: #2d3748;
        --nc-link-icon: #cbd5e0;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.1);
        --nc-badge-text: #3a7bd5;

        position: relative;
        background: var(--nc-bg-card);
        border-radius: 12px;
        box-shadow: var(--nc-shadow);
        margin: 2.5rem 0;
        overflow: hidden;
        border: 1px solid var(--nc-border);
        font-family: inherit; 
        transition: transform 0.3s ease, box-shadow 0.3s ease, background 0.3s, border-color 0.3s;
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .note-card {
            --nc-bg-card: #1e1e1e;
            --nc-border: #333333;
            --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
            --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
            
            --nc-title: #f0f0f0;
            --nc-meta: #999999;
            
            --nc-bg-context: #252525;
            --nc-border-context: #444444;
            --nc-quote-icon: #333333;
            --nc-text-summary: #aaaaaa;
            
            --nc-label-bg: #1e1e1e;
            --nc-label-text: #cccccc;
            --nc-content-text: #dddddd;
            --nc-link-icon: #666666;
            
            --nc-badge-bg: rgba(58, 123, 213, 0.2);
        }
    }

    html[data-scheme=&#34;dark&#34;] .note-card {
        --nc-bg-card: #1e1e1e;
        --nc-border: #333333;
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
        
        --nc-title: #f0f0f0;
        --nc-meta: #999999;
        
        --nc-bg-context: #252525;
        --nc-border-context: #444444;
        --nc-quote-icon: #333333;
        --nc-text-summary: #aaaaaa;
        
        --nc-label-bg: #1e1e1e;
        --nc-label-text: #cccccc;
        --nc-content-text: #dddddd;
        --nc-link-icon: #666666;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.2);
    }

    .note-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--nc-shadow-hover);
    }

     
    .nc-accent {
        height: 4px;
        background: linear-gradient(90deg, #3a7bd5, #00d2ff); 
        width: 100%;
    }

     
    .nc-header {
        padding: 24px 28px 10px; 
    }

    .nc-meta {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 10px; 
        font-size: 13px; 
        color: var(--nc-meta);
        font-weight: 600;
        letter-spacing: 1px;
        text-transform: uppercase;
    }

    .nc-badge {
        color: var(--nc-badge-text);
        background: var(--nc-badge-bg);
        padding: 2px 6px;
        border-radius: 4px;
    }

    .nc-title {
        display: block;
        font-size: 2rem; 
        font-weight: 700;
        color: var(--nc-title);
        text-decoration: none;
        line-height: 1.3;
        transition: color 0.2s;
    }

    .nc-title:hover {
        color: var(--nc-title-hover);
    }

    .nc-link-icon {
        width: 20px; 
        height: 20px;
        color: var(--nc-link-icon);
        margin-left: 5px;
        vertical-align: middle;
        transition: color 0.2s;
    }

    .nc-title:hover .nc-link-icon {
        color: var(--nc-title-hover);
    }

     
    .nc-context {
        margin: 12px 28px 24px;
        background: var(--nc-bg-context);
        padding: 20px 24px;
        border-radius: 8px;
        position: relative;
        border-left: 4px solid var(--nc-border-context);
        transition: background 0.3s, border-color 0.3s;
    }

    .nc-quote-icon {
        position: absolute;
        top: 8px;
        left: 10px;
        font-family: serif; 
        font-size: 40px;
        line-height: 1;
        color: var(--nc-quote-icon);
        pointer-events: none;
        transition: color 0.3s;
    }

    .nc-summary-text {
        font-size: 1.7rem; 
        color: var(--nc-text-summary);
        line-height: 1.6;
        font-style: italic;
        position: relative;
        z-index: 1;
        padding-left: 15px; 
        transition: color 0.3s;
    }

     
    .nc-body {
        padding: 0 28px 32px;
        position: relative;
    }

     
    .nc-label {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        font-size: 13px; 
        font-weight: 700;
        color: var(--nc-label-text);
        background: var(--nc-label-bg);
        padding-right: 10px;
        margin-bottom: 12px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
        transition: color 0.3s, background 0.3s;
    }

    .nc-content {
        color: var(--nc-content-text);
        font-size: 1.6rem; 
        line-height: 1.75;
        transition: color 0.3s;
    }

     
    .nc-content p { margin-bottom: 1em; }
    .nc-content p:last-child { margin-bottom: 0; }
    
    .nc-content ul { padding-left: 20px; color: inherit; }
    .nc-content li { margin-bottom: 6px; }
&lt;/style&gt;
&lt;h3 id=&#34;how-the-wound-man-healed-medieval-europe-伤痕累累之人如何治愈中世纪欧洲&#34;&gt;How the Wound Man Healed Medieval Europe 伤痕累累之人如何治愈中世纪欧洲
&lt;/h3&gt;&lt;div class=&#34;note-card&#34;&gt;
    &lt;div class=&#34;nc-accent&#34;&gt;&lt;/div&gt;

    &lt;div class=&#34;nc-header&#34;&gt;
        &lt;div class=&#34;nc-meta&#34;&gt;
            &lt;span class=&#34;nc-badge&#34;&gt;READING&lt;/span&gt;
            &lt;span class=&#34;nc-date&#34;&gt;2025-09-26&lt;/span&gt;
        &lt;/div&gt; &lt;a href=&#34;https://hyperallergic.com/1044154/how-the-wound-man-healed-medieval-europe/&#34; target=&#34;_blank&#34; class=&#34;nc-title&#34; title=&#34;访问原文&#34;&gt;
            How the Wound Man Healed Medieval Europe 伤痕累累之人如何治愈中世纪欧洲
            &lt;svg class=&#34;nc-link-icon&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
        &lt;/a&gt;
    &lt;/div&gt;

    
    &lt;div class=&#34;nc-context&#34;&gt;
        &lt;div class=&#34;nc-quote-icon&#34;&gt;“&lt;/div&gt;
        &lt;div class=&#34;nc-summary-text&#34;&gt;“伤者”图像在中世纪欧洲是一种象征，并非旨在引起恐惧，而是提供医学希望。这幅遍布武器、伤口和疾病痕迹的图画，附有治疗方案，为患者带来慰藉。艺术史学家杰克·哈特内尔在其著作《伤者：外科图像的多种生命》中，追溯了这一图像从14世纪末到18世纪在日本的演变，探讨了它如何与史诗英雄、退伍军人以及圣徒的苦难联系起来，引发观者的共鸣。尽管图像的某些含义仍待深入挖掘，且学术研究详尽有时显得冗余，但“伤者”作为一种灵活多变的医疗象征，其历史意义和文化价值不容忽视。&lt;/div&gt;
    &lt;/div&gt;
    

    
    
    
&lt;/div&gt;

&lt;style&gt;
     
    .note-card {
         
        --nc-bg-card: #ffffff;
        --nc-border: rgba(0,0,0,0.04);
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.08);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.12);
        
        --nc-title: #2c3e50;
        --nc-title-hover: #3a7bd5;
        --nc-meta: #999999;
        
        --nc-bg-context: #f8f9fa;
        --nc-border-context: #e2e8f0;
        --nc-quote-icon: #e2e8f0;
        --nc-text-summary: #555555;
        
        --nc-label-bg: #ffffff;
        --nc-label-text: #2d3748;
        --nc-content-text: #2d3748;
        --nc-link-icon: #cbd5e0;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.1);
        --nc-badge-text: #3a7bd5;

        position: relative;
        background: var(--nc-bg-card);
        border-radius: 12px;
        box-shadow: var(--nc-shadow);
        margin: 2.5rem 0;
        overflow: hidden;
        border: 1px solid var(--nc-border);
        font-family: inherit; 
        transition: transform 0.3s ease, box-shadow 0.3s ease, background 0.3s, border-color 0.3s;
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .note-card {
            --nc-bg-card: #1e1e1e;
            --nc-border: #333333;
            --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
            --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
            
            --nc-title: #f0f0f0;
            --nc-meta: #999999;
            
            --nc-bg-context: #252525;
            --nc-border-context: #444444;
            --nc-quote-icon: #333333;
            --nc-text-summary: #aaaaaa;
            
            --nc-label-bg: #1e1e1e;
            --nc-label-text: #cccccc;
            --nc-content-text: #dddddd;
            --nc-link-icon: #666666;
            
            --nc-badge-bg: rgba(58, 123, 213, 0.2);
        }
    }

    html[data-scheme=&#34;dark&#34;] .note-card {
        --nc-bg-card: #1e1e1e;
        --nc-border: #333333;
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
        
        --nc-title: #f0f0f0;
        --nc-meta: #999999;
        
        --nc-bg-context: #252525;
        --nc-border-context: #444444;
        --nc-quote-icon: #333333;
        --nc-text-summary: #aaaaaa;
        
        --nc-label-bg: #1e1e1e;
        --nc-label-text: #cccccc;
        --nc-content-text: #dddddd;
        --nc-link-icon: #666666;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.2);
    }

    .note-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--nc-shadow-hover);
    }

     
    .nc-accent {
        height: 4px;
        background: linear-gradient(90deg, #3a7bd5, #00d2ff); 
        width: 100%;
    }

     
    .nc-header {
        padding: 24px 28px 10px; 
    }

    .nc-meta {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 10px; 
        font-size: 13px; 
        color: var(--nc-meta);
        font-weight: 600;
        letter-spacing: 1px;
        text-transform: uppercase;
    }

    .nc-badge {
        color: var(--nc-badge-text);
        background: var(--nc-badge-bg);
        padding: 2px 6px;
        border-radius: 4px;
    }

    .nc-title {
        display: block;
        font-size: 2rem; 
        font-weight: 700;
        color: var(--nc-title);
        text-decoration: none;
        line-height: 1.3;
        transition: color 0.2s;
    }

    .nc-title:hover {
        color: var(--nc-title-hover);
    }

    .nc-link-icon {
        width: 20px; 
        height: 20px;
        color: var(--nc-link-icon);
        margin-left: 5px;
        vertical-align: middle;
        transition: color 0.2s;
    }

    .nc-title:hover .nc-link-icon {
        color: var(--nc-title-hover);
    }

     
    .nc-context {
        margin: 12px 28px 24px;
        background: var(--nc-bg-context);
        padding: 20px 24px;
        border-radius: 8px;
        position: relative;
        border-left: 4px solid var(--nc-border-context);
        transition: background 0.3s, border-color 0.3s;
    }

    .nc-quote-icon {
        position: absolute;
        top: 8px;
        left: 10px;
        font-family: serif; 
        font-size: 40px;
        line-height: 1;
        color: var(--nc-quote-icon);
        pointer-events: none;
        transition: color 0.3s;
    }

    .nc-summary-text {
        font-size: 1.7rem; 
        color: var(--nc-text-summary);
        line-height: 1.6;
        font-style: italic;
        position: relative;
        z-index: 1;
        padding-left: 15px; 
        transition: color 0.3s;
    }

     
    .nc-body {
        padding: 0 28px 32px;
        position: relative;
    }

     
    .nc-label {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        font-size: 13px; 
        font-weight: 700;
        color: var(--nc-label-text);
        background: var(--nc-label-bg);
        padding-right: 10px;
        margin-bottom: 12px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
        transition: color 0.3s, background 0.3s;
    }

    .nc-content {
        color: var(--nc-content-text);
        font-size: 1.6rem; 
        line-height: 1.75;
        transition: color 0.3s;
    }

     
    .nc-content p { margin-bottom: 1em; }
    .nc-content p:last-child { margin-bottom: 0; }
    
    .nc-content ul { padding-left: 20px; color: inherit; }
    .nc-content li { margin-bottom: 6px; }
&lt;/style&gt;
&lt;p&gt;&lt;img src=&#34;https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A2025%E5%B9%B4%E7%AC%AC29-30%E6%9C%9F%E5%90%88%E5%88%8A%E6%80%BB%E7%AC%AC29-30%E6%9C%9F/20250926-Picture02.jpg&#34;
	width=&#34;780&#34;
	height=&#34;1121&#34;
	srcset=&#34;https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A2025%E5%B9%B4%E7%AC%AC29-30%E6%9C%9F%E5%90%88%E5%88%8A%E6%80%BB%E7%AC%AC29-30%E6%9C%9F/20250926-Picture02_hu_46ff9a8fd52336e9.jpg 480w, https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A2025%E5%B9%B4%E7%AC%AC29-30%E6%9C%9F%E5%90%88%E5%88%8A%E6%80%BB%E7%AC%AC29-30%E6%9C%9F/20250926-Picture02_hu_9e7d47bd7143cc72.jpg 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;Sebastian Jäger，“Wound Man” (c. 1580)，ink and paint on parchment，painted in Vienna，Austria，held in UCLA’s Louise M. Darling Medical Library，MS Benjamin 8，fol. IVv (photo by Jack Hartnell) 塞巴斯蒂安·耶格尔，“伤者”（约 1580 年），墨水和颜料，羊皮纸，维也纳，奥地利绘制，收藏于加州大学洛杉矶分校露易丝·M·达林医学图书馆，MS Benjamin 8，fol. IVv（杰克·哈特内尔 摄）&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;69&#34;
		data-flex-basis=&#34;166px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A2025%E5%B9%B4%E7%AC%AC29-30%E6%9C%9F%E5%90%88%E5%88%8A%E6%80%BB%E7%AC%AC29-30%E6%9C%9F/20250926-Picture03.jpg&#34;
	width=&#34;780&#34;
	height=&#34;565&#34;
	srcset=&#34;https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A2025%E5%B9%B4%E7%AC%AC29-30%E6%9C%9F%E5%90%88%E5%88%8A%E6%80%BB%E7%AC%AC29-30%E6%9C%9F/20250926-Picture03_hu_89cf8d1560d0d1ef.jpg 480w, https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A2025%E5%B9%B4%E7%AC%AC29-30%E6%9C%9F%E5%90%88%E5%88%8A%E6%80%BB%E7%AC%AC29-30%E6%9C%9F/20250926-Picture03_hu_11d41bdb5af55603.jpg 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;Unrecorded artist，“Labyrinth and Wound Man” (c.1515–19)，ink and paint on paper in a German Bild Enzyklopädie，probably made in Bavaria (image public domain PDM 1.0 via Biblioteka Jagiellońska，Kraków，Poland) 无名艺术家，《迷宫与受伤的人》（约1515-19年），纸本设色，德国图画百科全书，可能制作于巴伐利亚（图像公共领域 PDM 1.0，来源：克拉科夫雅盖隆大学图书馆，波兰）&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;138&#34;
		data-flex-basis=&#34;331px&#34;
	
&gt;&lt;/p&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-21&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        Hartnell’s book is the most comprehensive study of the Wound Man to date. In five assiduously researched，generously illustrated chapters，he doggedly tracks the evolution of the enigmatic image over three centuries，from the first known example in a Bohemian manuscript from 1399 to variants produced in 18th-century Japan. Gathering examples from roughly 80 libraries，archives，and private collections in Europe，North America，and Asia，many of them new discoveries，Hartnell convincingly demonstrates the versatility of the Wound Man，which morphed to suit the needs of different times and places. Along the way，he delves into Medieval blood-letting diagrams，premodern surgical techniques，and the print technologies that enabled the Wound Man to spread from hand-drawn manuscripts to early modern books.
    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-21&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-22&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        哈特奈尔的书是对伤口人的最全面的研究。在他的五个精心研究、图文并茂的章节中，他孜孜不倦地追踪了这个神秘形象三个世纪的演变，从1399年波西米亚手稿中的第一个已知实例，到18世纪日本的变体。哈特奈尔收集了来自欧洲、北美和亚洲约80家图书馆、档案馆和私人收藏的实例，其中许多是新发现，他令人信服地展示了伤口人的多功能性，它会根据不同时代和地点的需求而演变。在此过程中，他深入研究了中世纪的放血图，前现代的外科技术，以及使伤口人能够从手绘手稿传播到近代早期书籍的印刷技术。
    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-22&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;
&lt;h3 id=&#34;bartolomé-de-las-casaswitness-to-the-violent-conquest-of-the-americas-巴托洛梅德拉斯卡萨斯美洲暴力征服的见证者&#34;&gt;Bartolomé De Las Casas，Witness to the Violent Conquest of the Americas 巴托洛梅·德拉斯卡萨斯：美洲暴力征服的见证者
&lt;/h3&gt;&lt;div class=&#34;note-card&#34;&gt;
    &lt;div class=&#34;nc-accent&#34;&gt;&lt;/div&gt;

    &lt;div class=&#34;nc-header&#34;&gt;
        &lt;div class=&#34;nc-meta&#34;&gt;
            &lt;span class=&#34;nc-badge&#34;&gt;READING&lt;/span&gt;
            &lt;span class=&#34;nc-date&#34;&gt;2025-09-26&lt;/span&gt;
        &lt;/div&gt; &lt;a href=&#34;https://lithub.com/bartolome-de-las-casas-witness-to-the-violent-conquest-of-the-americas/&#34; target=&#34;_blank&#34; class=&#34;nc-title&#34; title=&#34;访问原文&#34;&gt;
            Bartolomé De Las Casas，Witness to the Violent Conquest of the Americas 巴托洛梅·德拉斯卡萨斯：美洲暴力征服的见证者
            &lt;svg class=&#34;nc-link-icon&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
        &lt;/a&gt;
    &lt;/div&gt;

    
    &lt;div class=&#34;nc-context&#34;&gt;
        &lt;div class=&#34;nc-quote-icon&#34;&gt;“&lt;/div&gt;
        &lt;div class=&#34;nc-summary-text&#34;&gt;西班牙传教士巴塞洛缪·德·拉斯·卡萨斯目睹了美洲的血腥征服。他从最初的同谋转变为激烈批评者，认为所有人类都应享有平等，驳斥了“天生奴隶”的观念。他依据亲眼所见，记录了西班牙殖民者对美洲原住民的残酷暴行，包括屠杀、奴役和剥削，揭示了人类历史上最大规模的人口锐减事件。他的著作《西印度群岛毁灭简史》揭露了殖民者的罪行，影响深远。&lt;/div&gt;
    &lt;/div&gt;
    

    
    
    
&lt;/div&gt;

&lt;style&gt;
     
    .note-card {
         
        --nc-bg-card: #ffffff;
        --nc-border: rgba(0,0,0,0.04);
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.08);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.12);
        
        --nc-title: #2c3e50;
        --nc-title-hover: #3a7bd5;
        --nc-meta: #999999;
        
        --nc-bg-context: #f8f9fa;
        --nc-border-context: #e2e8f0;
        --nc-quote-icon: #e2e8f0;
        --nc-text-summary: #555555;
        
        --nc-label-bg: #ffffff;
        --nc-label-text: #2d3748;
        --nc-content-text: #2d3748;
        --nc-link-icon: #cbd5e0;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.1);
        --nc-badge-text: #3a7bd5;

        position: relative;
        background: var(--nc-bg-card);
        border-radius: 12px;
        box-shadow: var(--nc-shadow);
        margin: 2.5rem 0;
        overflow: hidden;
        border: 1px solid var(--nc-border);
        font-family: inherit; 
        transition: transform 0.3s ease, box-shadow 0.3s ease, background 0.3s, border-color 0.3s;
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .note-card {
            --nc-bg-card: #1e1e1e;
            --nc-border: #333333;
            --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
            --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
            
            --nc-title: #f0f0f0;
            --nc-meta: #999999;
            
            --nc-bg-context: #252525;
            --nc-border-context: #444444;
            --nc-quote-icon: #333333;
            --nc-text-summary: #aaaaaa;
            
            --nc-label-bg: #1e1e1e;
            --nc-label-text: #cccccc;
            --nc-content-text: #dddddd;
            --nc-link-icon: #666666;
            
            --nc-badge-bg: rgba(58, 123, 213, 0.2);
        }
    }

    html[data-scheme=&#34;dark&#34;] .note-card {
        --nc-bg-card: #1e1e1e;
        --nc-border: #333333;
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
        
        --nc-title: #f0f0f0;
        --nc-meta: #999999;
        
        --nc-bg-context: #252525;
        --nc-border-context: #444444;
        --nc-quote-icon: #333333;
        --nc-text-summary: #aaaaaa;
        
        --nc-label-bg: #1e1e1e;
        --nc-label-text: #cccccc;
        --nc-content-text: #dddddd;
        --nc-link-icon: #666666;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.2);
    }

    .note-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--nc-shadow-hover);
    }

     
    .nc-accent {
        height: 4px;
        background: linear-gradient(90deg, #3a7bd5, #00d2ff); 
        width: 100%;
    }

     
    .nc-header {
        padding: 24px 28px 10px; 
    }

    .nc-meta {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 10px; 
        font-size: 13px; 
        color: var(--nc-meta);
        font-weight: 600;
        letter-spacing: 1px;
        text-transform: uppercase;
    }

    .nc-badge {
        color: var(--nc-badge-text);
        background: var(--nc-badge-bg);
        padding: 2px 6px;
        border-radius: 4px;
    }

    .nc-title {
        display: block;
        font-size: 2rem; 
        font-weight: 700;
        color: var(--nc-title);
        text-decoration: none;
        line-height: 1.3;
        transition: color 0.2s;
    }

    .nc-title:hover {
        color: var(--nc-title-hover);
    }

    .nc-link-icon {
        width: 20px; 
        height: 20px;
        color: var(--nc-link-icon);
        margin-left: 5px;
        vertical-align: middle;
        transition: color 0.2s;
    }

    .nc-title:hover .nc-link-icon {
        color: var(--nc-title-hover);
    }

     
    .nc-context {
        margin: 12px 28px 24px;
        background: var(--nc-bg-context);
        padding: 20px 24px;
        border-radius: 8px;
        position: relative;
        border-left: 4px solid var(--nc-border-context);
        transition: background 0.3s, border-color 0.3s;
    }

    .nc-quote-icon {
        position: absolute;
        top: 8px;
        left: 10px;
        font-family: serif; 
        font-size: 40px;
        line-height: 1;
        color: var(--nc-quote-icon);
        pointer-events: none;
        transition: color 0.3s;
    }

    .nc-summary-text {
        font-size: 1.7rem; 
        color: var(--nc-text-summary);
        line-height: 1.6;
        font-style: italic;
        position: relative;
        z-index: 1;
        padding-left: 15px; 
        transition: color 0.3s;
    }

     
    .nc-body {
        padding: 0 28px 32px;
        position: relative;
    }

     
    .nc-label {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        font-size: 13px; 
        font-weight: 700;
        color: var(--nc-label-text);
        background: var(--nc-label-bg);
        padding-right: 10px;
        margin-bottom: 12px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
        transition: color 0.3s, background 0.3s;
    }

    .nc-content {
        color: var(--nc-content-text);
        font-size: 1.6rem; 
        line-height: 1.75;
        transition: color 0.3s;
    }

     
    .nc-content p { margin-bottom: 1em; }
    .nc-content p:last-child { margin-bottom: 0; }
    
    .nc-content ul { padding-left: 20px; color: inherit; }
    .nc-content li { margin-bottom: 6px; }
&lt;/style&gt;
&lt;h3 id=&#34;an-artists-unexpected-confrontation-with-mortality-一位艺术家出人意料的死亡直面&#34;&gt;An Artist’s Unexpected Confrontation With Mortality 一位艺术家出人意料的死亡直面
&lt;/h3&gt;&lt;div class=&#34;note-card&#34;&gt;
    &lt;div class=&#34;nc-accent&#34;&gt;&lt;/div&gt;

    &lt;div class=&#34;nc-header&#34;&gt;
        &lt;div class=&#34;nc-meta&#34;&gt;
            &lt;span class=&#34;nc-badge&#34;&gt;READING&lt;/span&gt;
            &lt;span class=&#34;nc-date&#34;&gt;2025-09-26&lt;/span&gt;
        &lt;/div&gt; &lt;a href=&#34;https://hyperallergic.com/1043876/artist-asako-tabata-unexpected-confrontation-with-mortality/&#34; target=&#34;_blank&#34; class=&#34;nc-title&#34; title=&#34;访问原文&#34;&gt;
            An Artist’s Unexpected Confrontation With Mortality 一位艺术家出人意料的死亡直面
            &lt;svg class=&#34;nc-link-icon&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
        &lt;/a&gt;
    &lt;/div&gt;

    
    &lt;div class=&#34;nc-context&#34;&gt;
        &lt;div class=&#34;nc-quote-icon&#34;&gt;“&lt;/div&gt;
        &lt;div class=&#34;nc-summary-text&#34;&gt;日裔艺术家田畑麻子（Asako Tabata）的新展《等待骨骸》（Waiting for Bones）探讨了她对母亲去世后自身死亡的深刻反思。展览包含近60件作品，形式多样，从模仿日本名片文化的拼贴，到描绘告别、火葬和升天的油画及纸浆雕塑。作品《天堂之上》悬挂在空中，内部可见多位孤身女性站在船上，与画作《再见》中告别的女性形象相呼应，暗示着生者与逝者之间、母女之间共享的对死亡的感知。田畑麻子以幽默、温柔却略带伤感的方式，直接展现其复杂的情感，不回避混乱与不确定性。她的纸浆雕塑“你好”也以其不稳固的姿态，映射出人物脆弱的情感状态。展览通过不同媒介的作品，深入挖掘难以言喻的情感，拒绝被简单解读。&lt;/div&gt;
    &lt;/div&gt;
    

    
    
    
&lt;/div&gt;

&lt;style&gt;
     
    .note-card {
         
        --nc-bg-card: #ffffff;
        --nc-border: rgba(0,0,0,0.04);
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.08);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.12);
        
        --nc-title: #2c3e50;
        --nc-title-hover: #3a7bd5;
        --nc-meta: #999999;
        
        --nc-bg-context: #f8f9fa;
        --nc-border-context: #e2e8f0;
        --nc-quote-icon: #e2e8f0;
        --nc-text-summary: #555555;
        
        --nc-label-bg: #ffffff;
        --nc-label-text: #2d3748;
        --nc-content-text: #2d3748;
        --nc-link-icon: #cbd5e0;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.1);
        --nc-badge-text: #3a7bd5;

        position: relative;
        background: var(--nc-bg-card);
        border-radius: 12px;
        box-shadow: var(--nc-shadow);
        margin: 2.5rem 0;
        overflow: hidden;
        border: 1px solid var(--nc-border);
        font-family: inherit; 
        transition: transform 0.3s ease, box-shadow 0.3s ease, background 0.3s, border-color 0.3s;
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .note-card {
            --nc-bg-card: #1e1e1e;
            --nc-border: #333333;
            --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
            --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
            
            --nc-title: #f0f0f0;
            --nc-meta: #999999;
            
            --nc-bg-context: #252525;
            --nc-border-context: #444444;
            --nc-quote-icon: #333333;
            --nc-text-summary: #aaaaaa;
            
            --nc-label-bg: #1e1e1e;
            --nc-label-text: #cccccc;
            --nc-content-text: #dddddd;
            --nc-link-icon: #666666;
            
            --nc-badge-bg: rgba(58, 123, 213, 0.2);
        }
    }

    html[data-scheme=&#34;dark&#34;] .note-card {
        --nc-bg-card: #1e1e1e;
        --nc-border: #333333;
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
        
        --nc-title: #f0f0f0;
        --nc-meta: #999999;
        
        --nc-bg-context: #252525;
        --nc-border-context: #444444;
        --nc-quote-icon: #333333;
        --nc-text-summary: #aaaaaa;
        
        --nc-label-bg: #1e1e1e;
        --nc-label-text: #cccccc;
        --nc-content-text: #dddddd;
        --nc-link-icon: #666666;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.2);
    }

    .note-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--nc-shadow-hover);
    }

     
    .nc-accent {
        height: 4px;
        background: linear-gradient(90deg, #3a7bd5, #00d2ff); 
        width: 100%;
    }

     
    .nc-header {
        padding: 24px 28px 10px; 
    }

    .nc-meta {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 10px; 
        font-size: 13px; 
        color: var(--nc-meta);
        font-weight: 600;
        letter-spacing: 1px;
        text-transform: uppercase;
    }

    .nc-badge {
        color: var(--nc-badge-text);
        background: var(--nc-badge-bg);
        padding: 2px 6px;
        border-radius: 4px;
    }

    .nc-title {
        display: block;
        font-size: 2rem; 
        font-weight: 700;
        color: var(--nc-title);
        text-decoration: none;
        line-height: 1.3;
        transition: color 0.2s;
    }

    .nc-title:hover {
        color: var(--nc-title-hover);
    }

    .nc-link-icon {
        width: 20px; 
        height: 20px;
        color: var(--nc-link-icon);
        margin-left: 5px;
        vertical-align: middle;
        transition: color 0.2s;
    }

    .nc-title:hover .nc-link-icon {
        color: var(--nc-title-hover);
    }

     
    .nc-context {
        margin: 12px 28px 24px;
        background: var(--nc-bg-context);
        padding: 20px 24px;
        border-radius: 8px;
        position: relative;
        border-left: 4px solid var(--nc-border-context);
        transition: background 0.3s, border-color 0.3s;
    }

    .nc-quote-icon {
        position: absolute;
        top: 8px;
        left: 10px;
        font-family: serif; 
        font-size: 40px;
        line-height: 1;
        color: var(--nc-quote-icon);
        pointer-events: none;
        transition: color 0.3s;
    }

    .nc-summary-text {
        font-size: 1.7rem; 
        color: var(--nc-text-summary);
        line-height: 1.6;
        font-style: italic;
        position: relative;
        z-index: 1;
        padding-left: 15px; 
        transition: color 0.3s;
    }

     
    .nc-body {
        padding: 0 28px 32px;
        position: relative;
    }

     
    .nc-label {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        font-size: 13px; 
        font-weight: 700;
        color: var(--nc-label-text);
        background: var(--nc-label-bg);
        padding-right: 10px;
        margin-bottom: 12px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
        transition: color 0.3s, background 0.3s;
    }

    .nc-content {
        color: var(--nc-content-text);
        font-size: 1.6rem; 
        line-height: 1.75;
        transition: color 0.3s;
    }

     
    .nc-content p { margin-bottom: 1em; }
    .nc-content p:last-child { margin-bottom: 0; }
    
    .nc-content ul { padding-left: 20px; color: inherit; }
    .nc-content li { margin-bottom: 6px; }
&lt;/style&gt;
&lt;h3 id=&#34;辽代应县木塔专题展再现千年木构的奇迹&#34;&gt;辽代应县木塔专题展：再现千年木构的奇迹
&lt;/h3&gt;&lt;div class=&#34;note-card&#34;&gt;
    &lt;div class=&#34;nc-accent&#34;&gt;&lt;/div&gt;

    &lt;div class=&#34;nc-header&#34;&gt;
        &lt;div class=&#34;nc-meta&#34;&gt;
            &lt;span class=&#34;nc-badge&#34;&gt;READING&lt;/span&gt;
            &lt;span class=&#34;nc-date&#34;&gt;2025-09-26&lt;/span&gt;
        &lt;/div&gt; &lt;a href=&#34;https://m.thepaper.cn/detail/31652924&#34; target=&#34;_blank&#34; class=&#34;nc-title&#34; title=&#34;访问原文&#34;&gt;
            辽代应县木塔专题展：再现千年木构的奇迹
            &lt;svg class=&#34;nc-link-icon&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
        &lt;/a&gt;
    &lt;/div&gt;

    
    &lt;div class=&#34;nc-context&#34;&gt;
        &lt;div class=&#34;nc-quote-icon&#34;&gt;“&lt;/div&gt;
        &lt;div class=&#34;nc-summary-text&#34;&gt;山西博物院举办“应县木塔——千年木构的奇迹与回响”专题展，展出130余幅高清影像，系统展示了辽代应县木塔的建筑遗存、宗教艺术及装藏文物。展区分“建筑奇迹”、“塔中佛国”、“装藏文物”三单元。同期首发的大型影像文献集《应县木塔》收录800余幅超高清图像，展现了木塔的建筑细节与艺术神韵，并首次高精出版大量国宝级装藏文物，为研究提供了重要材料。专家学者就木塔研究、古建筑、壁画造像、装藏文物等主题进行了研讨。&lt;/div&gt;
    &lt;/div&gt;
    

    
    
    
&lt;/div&gt;

&lt;style&gt;
     
    .note-card {
         
        --nc-bg-card: #ffffff;
        --nc-border: rgba(0,0,0,0.04);
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.08);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.12);
        
        --nc-title: #2c3e50;
        --nc-title-hover: #3a7bd5;
        --nc-meta: #999999;
        
        --nc-bg-context: #f8f9fa;
        --nc-border-context: #e2e8f0;
        --nc-quote-icon: #e2e8f0;
        --nc-text-summary: #555555;
        
        --nc-label-bg: #ffffff;
        --nc-label-text: #2d3748;
        --nc-content-text: #2d3748;
        --nc-link-icon: #cbd5e0;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.1);
        --nc-badge-text: #3a7bd5;

        position: relative;
        background: var(--nc-bg-card);
        border-radius: 12px;
        box-shadow: var(--nc-shadow);
        margin: 2.5rem 0;
        overflow: hidden;
        border: 1px solid var(--nc-border);
        font-family: inherit; 
        transition: transform 0.3s ease, box-shadow 0.3s ease, background 0.3s, border-color 0.3s;
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .note-card {
            --nc-bg-card: #1e1e1e;
            --nc-border: #333333;
            --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
            --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
            
            --nc-title: #f0f0f0;
            --nc-meta: #999999;
            
            --nc-bg-context: #252525;
            --nc-border-context: #444444;
            --nc-quote-icon: #333333;
            --nc-text-summary: #aaaaaa;
            
            --nc-label-bg: #1e1e1e;
            --nc-label-text: #cccccc;
            --nc-content-text: #dddddd;
            --nc-link-icon: #666666;
            
            --nc-badge-bg: rgba(58, 123, 213, 0.2);
        }
    }

    html[data-scheme=&#34;dark&#34;] .note-card {
        --nc-bg-card: #1e1e1e;
        --nc-border: #333333;
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
        
        --nc-title: #f0f0f0;
        --nc-meta: #999999;
        
        --nc-bg-context: #252525;
        --nc-border-context: #444444;
        --nc-quote-icon: #333333;
        --nc-text-summary: #aaaaaa;
        
        --nc-label-bg: #1e1e1e;
        --nc-label-text: #cccccc;
        --nc-content-text: #dddddd;
        --nc-link-icon: #666666;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.2);
    }

    .note-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--nc-shadow-hover);
    }

     
    .nc-accent {
        height: 4px;
        background: linear-gradient(90deg, #3a7bd5, #00d2ff); 
        width: 100%;
    }

     
    .nc-header {
        padding: 24px 28px 10px; 
    }

    .nc-meta {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 10px; 
        font-size: 13px; 
        color: var(--nc-meta);
        font-weight: 600;
        letter-spacing: 1px;
        text-transform: uppercase;
    }

    .nc-badge {
        color: var(--nc-badge-text);
        background: var(--nc-badge-bg);
        padding: 2px 6px;
        border-radius: 4px;
    }

    .nc-title {
        display: block;
        font-size: 2rem; 
        font-weight: 700;
        color: var(--nc-title);
        text-decoration: none;
        line-height: 1.3;
        transition: color 0.2s;
    }

    .nc-title:hover {
        color: var(--nc-title-hover);
    }

    .nc-link-icon {
        width: 20px; 
        height: 20px;
        color: var(--nc-link-icon);
        margin-left: 5px;
        vertical-align: middle;
        transition: color 0.2s;
    }

    .nc-title:hover .nc-link-icon {
        color: var(--nc-title-hover);
    }

     
    .nc-context {
        margin: 12px 28px 24px;
        background: var(--nc-bg-context);
        padding: 20px 24px;
        border-radius: 8px;
        position: relative;
        border-left: 4px solid var(--nc-border-context);
        transition: background 0.3s, border-color 0.3s;
    }

    .nc-quote-icon {
        position: absolute;
        top: 8px;
        left: 10px;
        font-family: serif; 
        font-size: 40px;
        line-height: 1;
        color: var(--nc-quote-icon);
        pointer-events: none;
        transition: color 0.3s;
    }

    .nc-summary-text {
        font-size: 1.7rem; 
        color: var(--nc-text-summary);
        line-height: 1.6;
        font-style: italic;
        position: relative;
        z-index: 1;
        padding-left: 15px; 
        transition: color 0.3s;
    }

     
    .nc-body {
        padding: 0 28px 32px;
        position: relative;
    }

     
    .nc-label {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        font-size: 13px; 
        font-weight: 700;
        color: var(--nc-label-text);
        background: var(--nc-label-bg);
        padding-right: 10px;
        margin-bottom: 12px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
        transition: color 0.3s, background 0.3s;
    }

    .nc-content {
        color: var(--nc-content-text);
        font-size: 1.6rem; 
        line-height: 1.75;
        transition: color 0.3s;
    }

     
    .nc-content p { margin-bottom: 1em; }
    .nc-content p:last-child { margin-bottom: 0; }
    
    .nc-content ul { padding-left: 20px; color: inherit; }
    .nc-content li { margin-bottom: 6px; }
&lt;/style&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-26&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        应县木塔(又名佛宫寺.释迦塔)，建于公元1056年（辽清宁二年，即北宋至和三年），塔高67.31米，底层直径30.27米总重量约为7400多吨，是世界上现存最高大、最古老纯木结构楼阁式建筑。1961年，国务院公布为全国重点文物保护单位，2016年9月，被吉尼斯世界纪录认证为“世界上最高的木塔”。 应县木塔从外观看，稳重端庄、比例得当、轮廓优美。古籍上称“浮图之丽、甲于宇内”。
    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-26&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-27&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        木塔整个建筑由塔基、塔身、塔刹三部分组成。全塔上下有59种不同形式、成百上千朵斗拱（斗拱既可以替立柱分担重量，又能对外来的力量起到缓冲、分散的作用），犹如朵朵盛开的莲花装点于塔身各处，种类之多国内罕见，有“斗拱博物馆”之称。古籍上誉其为“远看擎天柱，近似百尺莲”。从结构上讲，应县木塔的设计更为巧妙，全塔上下没有用一颗铁钉，全靠木构件互相卯榫咬合而成。
    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-27&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-28&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        &lt;p&gt;由梁鉴主编，叶南执行主编，任超摄影，山西博物院、应县人民政府编大型图像文献集《应县木塔》在活动现场首发。该书是迄今关于应县木塔最全面、最系统、最清晰的超大型四开影像文献。全书收录 800 余幅超高清图像，涵盖木构、造像、壁画、匾额及装藏文物等各类遗存，超高精度展现木塔的建筑细节与艺术神韵。有别于以往单一的建筑史视角，融汇考古学、艺术史、宗教研究、古籍版本、丝织非遗等多维学科成果。书中大批国宝级装藏文物首次高精出版，为宗教史、印刷史、艺术史提供一手重要材料。&lt;/p&gt;
&lt;p&gt;全书以应县木塔建筑空间为核心遵循由内及外、由木塔中心佛像扩散至四周的逻辑顺序，逐层展示第一层至第五层内的各类文物遗存，营造穿越时空的沉浸式阅读体验。通过全塔壁画与题记的超清细节呈现和红外摄影技术揭示被岁月湮没的绘画笔触、墨迹改绘与历史信息，为学界与公众提供全新的研究材料与审美视角。&lt;/p&gt;

    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-28&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;
&lt;h3 id=&#34;what-pride-and-prejudice-tells-us-about-british-historyclassand-womens-leisure-time-傲慢与偏见告诉我们关于英国历史阶级和女性闲暇时间的一切&#34;&gt;What Pride and Prejudice Tells Us About British History，Class，and Women’s Leisure Time 《傲慢与偏见》告诉我们关于英国历史、阶级和女性闲暇时间的一切
&lt;/h3&gt;&lt;div class=&#34;note-card&#34;&gt;
    &lt;div class=&#34;nc-accent&#34;&gt;&lt;/div&gt;

    &lt;div class=&#34;nc-header&#34;&gt;
        &lt;div class=&#34;nc-meta&#34;&gt;
            &lt;span class=&#34;nc-badge&#34;&gt;READING&lt;/span&gt;
            &lt;span class=&#34;nc-date&#34;&gt;2025-09-26&lt;/span&gt;
        &lt;/div&gt; &lt;a href=&#34;https://lithub.com/what-pride-and-prejudice-tells-us-about-british-history-class-and-womens-leisure-time/&#34; target=&#34;_blank&#34; class=&#34;nc-title&#34; title=&#34;访问原文&#34;&gt;
            What Pride and Prejudice Tells Us About British History，Class，and Women’s Leisure Time 《傲慢与偏见》告诉我们关于英国历史、阶级和女性闲暇时间的一切
            &lt;svg class=&#34;nc-link-icon&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
        &lt;/a&gt;
    &lt;/div&gt;

    
    &lt;div class=&#34;nc-context&#34;&gt;
        &lt;div class=&#34;nc-quote-icon&#34;&gt;“&lt;/div&gt;
        &lt;div class=&#34;nc-summary-text&#34;&gt;《傲慢与偏见》反映了英国雷琴斯时代的社会阶级、婚姻和女性的休闲生活。故事围绕班纳特家五个女儿的婚事展开，她们的家庭地位和财产继承问题迫使她们必须通过婚姻来改善命运。小说描绘了一个婚姻与财产、社会地位紧密相连的世界。简·奥斯汀的作品在英国政治动荡、社会变革和女性权利意识觉醒的时代背景下创作，尽管小说表面上聚焦于爱情故事，但其实隐晦地触及了帝国经济、奴隶贸易以及女性作为读者和作者的社会地位等议题。&lt;/div&gt;
    &lt;/div&gt;
    

    
    
    
&lt;/div&gt;

&lt;style&gt;
     
    .note-card {
         
        --nc-bg-card: #ffffff;
        --nc-border: rgba(0,0,0,0.04);
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.08);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.12);
        
        --nc-title: #2c3e50;
        --nc-title-hover: #3a7bd5;
        --nc-meta: #999999;
        
        --nc-bg-context: #f8f9fa;
        --nc-border-context: #e2e8f0;
        --nc-quote-icon: #e2e8f0;
        --nc-text-summary: #555555;
        
        --nc-label-bg: #ffffff;
        --nc-label-text: #2d3748;
        --nc-content-text: #2d3748;
        --nc-link-icon: #cbd5e0;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.1);
        --nc-badge-text: #3a7bd5;

        position: relative;
        background: var(--nc-bg-card);
        border-radius: 12px;
        box-shadow: var(--nc-shadow);
        margin: 2.5rem 0;
        overflow: hidden;
        border: 1px solid var(--nc-border);
        font-family: inherit; 
        transition: transform 0.3s ease, box-shadow 0.3s ease, background 0.3s, border-color 0.3s;
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .note-card {
            --nc-bg-card: #1e1e1e;
            --nc-border: #333333;
            --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
            --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
            
            --nc-title: #f0f0f0;
            --nc-meta: #999999;
            
            --nc-bg-context: #252525;
            --nc-border-context: #444444;
            --nc-quote-icon: #333333;
            --nc-text-summary: #aaaaaa;
            
            --nc-label-bg: #1e1e1e;
            --nc-label-text: #cccccc;
            --nc-content-text: #dddddd;
            --nc-link-icon: #666666;
            
            --nc-badge-bg: rgba(58, 123, 213, 0.2);
        }
    }

    html[data-scheme=&#34;dark&#34;] .note-card {
        --nc-bg-card: #1e1e1e;
        --nc-border: #333333;
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
        
        --nc-title: #f0f0f0;
        --nc-meta: #999999;
        
        --nc-bg-context: #252525;
        --nc-border-context: #444444;
        --nc-quote-icon: #333333;
        --nc-text-summary: #aaaaaa;
        
        --nc-label-bg: #1e1e1e;
        --nc-label-text: #cccccc;
        --nc-content-text: #dddddd;
        --nc-link-icon: #666666;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.2);
    }

    .note-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--nc-shadow-hover);
    }

     
    .nc-accent {
        height: 4px;
        background: linear-gradient(90deg, #3a7bd5, #00d2ff); 
        width: 100%;
    }

     
    .nc-header {
        padding: 24px 28px 10px; 
    }

    .nc-meta {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 10px; 
        font-size: 13px; 
        color: var(--nc-meta);
        font-weight: 600;
        letter-spacing: 1px;
        text-transform: uppercase;
    }

    .nc-badge {
        color: var(--nc-badge-text);
        background: var(--nc-badge-bg);
        padding: 2px 6px;
        border-radius: 4px;
    }

    .nc-title {
        display: block;
        font-size: 2rem; 
        font-weight: 700;
        color: var(--nc-title);
        text-decoration: none;
        line-height: 1.3;
        transition: color 0.2s;
    }

    .nc-title:hover {
        color: var(--nc-title-hover);
    }

    .nc-link-icon {
        width: 20px; 
        height: 20px;
        color: var(--nc-link-icon);
        margin-left: 5px;
        vertical-align: middle;
        transition: color 0.2s;
    }

    .nc-title:hover .nc-link-icon {
        color: var(--nc-title-hover);
    }

     
    .nc-context {
        margin: 12px 28px 24px;
        background: var(--nc-bg-context);
        padding: 20px 24px;
        border-radius: 8px;
        position: relative;
        border-left: 4px solid var(--nc-border-context);
        transition: background 0.3s, border-color 0.3s;
    }

    .nc-quote-icon {
        position: absolute;
        top: 8px;
        left: 10px;
        font-family: serif; 
        font-size: 40px;
        line-height: 1;
        color: var(--nc-quote-icon);
        pointer-events: none;
        transition: color 0.3s;
    }

    .nc-summary-text {
        font-size: 1.7rem; 
        color: var(--nc-text-summary);
        line-height: 1.6;
        font-style: italic;
        position: relative;
        z-index: 1;
        padding-left: 15px; 
        transition: color 0.3s;
    }

     
    .nc-body {
        padding: 0 28px 32px;
        position: relative;
    }

     
    .nc-label {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        font-size: 13px; 
        font-weight: 700;
        color: var(--nc-label-text);
        background: var(--nc-label-bg);
        padding-right: 10px;
        margin-bottom: 12px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
        transition: color 0.3s, background 0.3s;
    }

    .nc-content {
        color: var(--nc-content-text);
        font-size: 1.6rem; 
        line-height: 1.75;
        transition: color 0.3s;
    }

     
    .nc-content p { margin-bottom: 1em; }
    .nc-content p:last-child { margin-bottom: 0; }
    
    .nc-content ul { padding-left: 20px; color: inherit; }
    .nc-content li { margin-bottom: 6px; }
&lt;/style&gt;
&lt;h3 id=&#34;秋水读信仰与利益之网禅僧外交中的政治&#34;&gt;秋水读《信仰与利益之网》︱“禅僧外交”中的政治
&lt;/h3&gt;&lt;div class=&#34;note-card&#34;&gt;
    &lt;div class=&#34;nc-accent&#34;&gt;&lt;/div&gt;

    &lt;div class=&#34;nc-header&#34;&gt;
        &lt;div class=&#34;nc-meta&#34;&gt;
            &lt;span class=&#34;nc-badge&#34;&gt;READING&lt;/span&gt;
            &lt;span class=&#34;nc-date&#34;&gt;2025-09-26&lt;/span&gt;
        &lt;/div&gt; &lt;a href=&#34;https://www.thepaper.cn/newsDetail_forward_31645029?commTag=true&#34; target=&#34;_blank&#34; class=&#34;nc-title&#34; title=&#34;访问原文&#34;&gt;
            秋水读《信仰与利益之网》︱“禅僧外交”中的政治
            &lt;svg class=&#34;nc-link-icon&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
        &lt;/a&gt;
    &lt;/div&gt;

    
    &lt;div class=&#34;nc-context&#34;&gt;
        &lt;div class=&#34;nc-quote-icon&#34;&gt;“&lt;/div&gt;
        &lt;div class=&#34;nc-summary-text&#34;&gt;《信仰与利益之网》一书探讨了中世纪日本对外交流，指出其并非仅是“朝贡体系”，而是由僧侣和海商组成的“宗教-商业网络”。然而，该书对政治因素的探讨不足，而宗教、商业与政治在中国、日本和朝鲜的交流中密不可分。文章详细介绍了“大洋路”与“南岛路”两条航线的变迁，以及“禅僧外交”在日本对外交流中的关键作用。禅僧们不仅作为宗教人士，更因其汉文素养和外交能力，成为了重要的“非正式外交官”，连接了东亚海域的交流网络。信仰、利益与政治共同塑造了这一复杂的交流图景。&lt;/div&gt;
    &lt;/div&gt;
    

    
    
    
&lt;/div&gt;

&lt;style&gt;
     
    .note-card {
         
        --nc-bg-card: #ffffff;
        --nc-border: rgba(0,0,0,0.04);
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.08);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.12);
        
        --nc-title: #2c3e50;
        --nc-title-hover: #3a7bd5;
        --nc-meta: #999999;
        
        --nc-bg-context: #f8f9fa;
        --nc-border-context: #e2e8f0;
        --nc-quote-icon: #e2e8f0;
        --nc-text-summary: #555555;
        
        --nc-label-bg: #ffffff;
        --nc-label-text: #2d3748;
        --nc-content-text: #2d3748;
        --nc-link-icon: #cbd5e0;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.1);
        --nc-badge-text: #3a7bd5;

        position: relative;
        background: var(--nc-bg-card);
        border-radius: 12px;
        box-shadow: var(--nc-shadow);
        margin: 2.5rem 0;
        overflow: hidden;
        border: 1px solid var(--nc-border);
        font-family: inherit; 
        transition: transform 0.3s ease, box-shadow 0.3s ease, background 0.3s, border-color 0.3s;
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .note-card {
            --nc-bg-card: #1e1e1e;
            --nc-border: #333333;
            --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
            --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
            
            --nc-title: #f0f0f0;
            --nc-meta: #999999;
            
            --nc-bg-context: #252525;
            --nc-border-context: #444444;
            --nc-quote-icon: #333333;
            --nc-text-summary: #aaaaaa;
            
            --nc-label-bg: #1e1e1e;
            --nc-label-text: #cccccc;
            --nc-content-text: #dddddd;
            --nc-link-icon: #666666;
            
            --nc-badge-bg: rgba(58, 123, 213, 0.2);
        }
    }

    html[data-scheme=&#34;dark&#34;] .note-card {
        --nc-bg-card: #1e1e1e;
        --nc-border: #333333;
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
        
        --nc-title: #f0f0f0;
        --nc-meta: #999999;
        
        --nc-bg-context: #252525;
        --nc-border-context: #444444;
        --nc-quote-icon: #333333;
        --nc-text-summary: #aaaaaa;
        
        --nc-label-bg: #1e1e1e;
        --nc-label-text: #cccccc;
        --nc-content-text: #dddddd;
        --nc-link-icon: #666666;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.2);
    }

    .note-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--nc-shadow-hover);
    }

     
    .nc-accent {
        height: 4px;
        background: linear-gradient(90deg, #3a7bd5, #00d2ff); 
        width: 100%;
    }

     
    .nc-header {
        padding: 24px 28px 10px; 
    }

    .nc-meta {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 10px; 
        font-size: 13px; 
        color: var(--nc-meta);
        font-weight: 600;
        letter-spacing: 1px;
        text-transform: uppercase;
    }

    .nc-badge {
        color: var(--nc-badge-text);
        background: var(--nc-badge-bg);
        padding: 2px 6px;
        border-radius: 4px;
    }

    .nc-title {
        display: block;
        font-size: 2rem; 
        font-weight: 700;
        color: var(--nc-title);
        text-decoration: none;
        line-height: 1.3;
        transition: color 0.2s;
    }

    .nc-title:hover {
        color: var(--nc-title-hover);
    }

    .nc-link-icon {
        width: 20px; 
        height: 20px;
        color: var(--nc-link-icon);
        margin-left: 5px;
        vertical-align: middle;
        transition: color 0.2s;
    }

    .nc-title:hover .nc-link-icon {
        color: var(--nc-title-hover);
    }

     
    .nc-context {
        margin: 12px 28px 24px;
        background: var(--nc-bg-context);
        padding: 20px 24px;
        border-radius: 8px;
        position: relative;
        border-left: 4px solid var(--nc-border-context);
        transition: background 0.3s, border-color 0.3s;
    }

    .nc-quote-icon {
        position: absolute;
        top: 8px;
        left: 10px;
        font-family: serif; 
        font-size: 40px;
        line-height: 1;
        color: var(--nc-quote-icon);
        pointer-events: none;
        transition: color 0.3s;
    }

    .nc-summary-text {
        font-size: 1.7rem; 
        color: var(--nc-text-summary);
        line-height: 1.6;
        font-style: italic;
        position: relative;
        z-index: 1;
        padding-left: 15px; 
        transition: color 0.3s;
    }

     
    .nc-body {
        padding: 0 28px 32px;
        position: relative;
    }

     
    .nc-label {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        font-size: 13px; 
        font-weight: 700;
        color: var(--nc-label-text);
        background: var(--nc-label-bg);
        padding-right: 10px;
        margin-bottom: 12px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
        transition: color 0.3s, background 0.3s;
    }

    .nc-content {
        color: var(--nc-content-text);
        font-size: 1.6rem; 
        line-height: 1.75;
        transition: color 0.3s;
    }

     
    .nc-content p { margin-bottom: 1em; }
    .nc-content p:last-child { margin-bottom: 0; }
    
    .nc-content ul { padding-left: 20px; color: inherit; }
    .nc-content li { margin-bottom: 6px; }
&lt;/style&gt;
&lt;p&gt;&lt;img src=&#34;https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A2025%E5%B9%B4%E7%AC%AC29-30%E6%9C%9F%E5%90%88%E5%88%8A%E6%80%BB%E7%AC%AC29-30%E6%9C%9F/20250926-Picture04.jpg&#34;
	width=&#34;1024&#34;
	height=&#34;1417&#34;
	srcset=&#34;https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A2025%E5%B9%B4%E7%AC%AC29-30%E6%9C%9F%E5%90%88%E5%88%8A%E6%80%BB%E7%AC%AC29-30%E6%9C%9F/20250926-Picture04_hu_284157145611f202.jpg 480w, https://www.laujoe.top/p/sf%E5%91%A8%E5%88%8A2025%E5%B9%B4%E7%AC%AC29-30%E6%9C%9F%E5%90%88%E5%88%8A%E6%80%BB%E7%AC%AC29-30%E6%9C%9F/20250926-Picture04_hu_a6da709ea024c6f1.jpg 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;《信仰与利益之网: 僧侣、海商与中日交流》，李怡文著，冯立君、傅亭瑄译，北京大学出版社2025年1月出版，240页，80.00元&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;72&#34;
		data-flex-basis=&#34;173px&#34;
	
&gt;&lt;/p&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-31&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        &lt;p&gt;香港城市大学中文与历史学系李怡文副教授的《信仰与利益之网：僧侣、海商与中日交流》是今年获得列文森奖荣誉提名的一本东亚研究著作。本书将中世日本的对外交流形容为“宗教-商业网络”，对日本遣唐使的官方外交取消后的交流史进行了大框架式的概括，是一个具有启发性的视角。这一选题关注到中世日本对外交流中的“信仰与利益之网”，对英文世界的读者来说，有助于修正东亚世界“朝贡体系”的单一印象，对中文世界的读者来说，也系统梳理了九至十五世纪的中日“非正式外交”，有助于读者认识到一般常识以外的海域交流诸多面向。&lt;/p&gt;
&lt;p&gt;书中提出了“共同的宗教信仰是否能提升贸易效率”的探讨，但对另一个不容忽视的在场因素——政治之网——则讨论不多。回顾日本学界的研究史可见，中世日本的交流史不仅仅是基于群体性人际关系网络的“宗教-商业”框架。贸易航路的转变、僧侣的政治·外交功能、商业活动中与政治密切相关的“伪使”问题、汉诗唱和的礼仪文化等都说明中世日本对外交流史的考察不应仅在“宗教-商业网络”框架下进行，利益、信仰与政治也是密不可分的。无论是“禅僧外交”或“伪使”现象，还是对“唐物”的需求，都与政治史脱不开关系。村井章介曾经指出，史料上以求法僧身份出现的人，同时也存在作为外交使节的可能性，也就是“外交与求法不可分离论”。在中世日本，无论是宗教还是商业，都是广义政治的一部分。&lt;/p&gt;

    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-31&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-32&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        学者河上麻由子曾指出，当遣唐使派遣的意义随着平安王朝国家的政治推进而消失，天皇不再需要通过派遣遣唐使来进行王朝国家的外交礼仪，天皇与外部世界的联系发生了逆转。但中世日本与大陆和半岛的东亚海域交流，继续通过《信仰与利益之网》指出的僧侣与海商组成的网络进行着。在以博多为中心的中世东亚海域贸易网络中，从大洋路到南岛路的路线转换是一大关键。申叔舟记录其1443年出访日本的《海东诸国纪》中，就记载博多为“琉球·南蛮商船聚集地”。遣唐使时代，大洋路是主要航路，出五岛列岛，直到明州（宁波），一直持续到日本与宋的贸易时期（明州与博多、福原）。南岛路则是走奄美、冲绳诸岛到宁波或福州，由多条航线构成，并不是固定的。南岛路曾经还是海贼多发地，奄美海贼会主动袭击统领九州外交、贸易的机构大宰府。因此大宰府当时在奄美群岛也设立有派出机构以防备海贼，该派出机构的遗址近年已被考古发现。随着大洋路因两次“蒙古袭来”和元末战乱而受阻，南岛路逐渐兴起，在冲绳和奄美考古发现的福建产粗制白瓷就是贸易转移的证据。此时，大洋路与南岛路还是并用的，但是航路选择更多地往南岛路倾斜。随着南岛路的兴起，琉球的三山王权得以发展，明使杨载到访博多，在回国途中发现了中山王权的那霸港，最终促成了册封。除了博多商人恢复贸易路线的意愿，琉球朝贡贸易的诞生也源于南岛路上形成固定交易据点的需求。室町期遣明船也开始从堺（南海路）或博多出发，从积累了丰富航海经验的南岛路前往宁波，实现了大洋路向南岛路的转换。
    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-32&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-33&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        但近世的海域逻辑再次发生变化，来自江浙、闽粤和东南亚的唐船重新利用大洋路前往长崎。在十八世纪后期以江浙船为主体的长崎“南京贸易”时代，近世的乍浦漂流民送还机制也形成了一条乍浦-长崎的固定航线，南岛路成为琉球和萨摩利用的航线，专营朝贡唐物贸易。到了十九世纪，来航增多的西洋船将南岛路再次变为一个补给点。原本的博多-朝鲜航路，也由对马-釜山口取代。需要注意的是，海域间往来的商人主体是多元的，并不能说哪个商人群体就像威尼斯商人那样构筑了一个主导性的网络，伊藤幸司就曾指出研究史上过度强调博多商人主导作用的问题。博多-大洋路是最早的博多-宁波航线，当南岛路兴起以后，日本对接南九州的南海路也就更发达。在大洋路到南岛路的转换中，堺的南海路贸易也开始兴起。从“物的贸易史”视角看，南岛路原本的“区域内贸易”产品主要是硫黄、夜光贝、法螺等南岛土产，而宋海商为调运这些日本与宋、高丽贸易中不可缺少的产品而往来于南岛路，渐渐熟悉了南岛路的航线。当大洋路的航运风险提高时，南岛路就自然成为平替，瓷器和生丝以及其他唐物奢侈品开始成为南岛路新的主流商品，并在十五至十六世纪被多样化的海上势力所利用，直到近世又重回“区域内交流”。南岛路不仅和南海路得以连接，并且与博多-朝鲜航路也得以连接。
    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-33&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-34&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        由于日朝之间的通交有着“岁遣船”的制度，九州与西国诸氏能够正式派遣的贸易许可船都有定数，这种情况催生了九州与西国诸氏势力派遣“伪使”的应变。十五世纪曾经出现冒充琉球王国使节的“伪使”以获利的博多商人，对马宗氏也曾经派遣“王城大臣”的伪使。但伪使需要相应的外交能力和情报收集能力，特别是书契的起草和改编，必须具备能继承先例和实事、运用修辞技术的高级汉文能力。例如，对马宗氏在对马的佐贺景德庵邀请了禅僧仰之梵高，从事发行书契和文引的外交业务。仰之梵高是1463年以天龙寺劝进船为目的派遣的日本国王使的副使，是梦窗派华藏门派的五山僧。他在对马的逗留，意味着宗氏可以通过他获得京都五山系僧侣的外交文书起草能力，以及与中央（京都）直接联系的情报网络，从而有可能产生多种伪使。这些伪使的共同点是，以掌握实际权力的政治人物的名义进行对朝鲜外交活动。例如，在应仁之乱前后京都周边政治局势极度混乱时，伪使就乘政治动荡之机而产生。1474年，根据室町幕府的提议，朝鲜方面实施了以日本国王、王城大臣名义阻止伪使通交的符验（牙符）制度，冒充日本国王和大臣的伪使问题得以消退，但冒充琉球国王使甚至其他虚构国家使节（例如“久边国”）的伪使依然存在。九州的境界势力（中世跨越国境海域间活动的势力，关于这个概念，具体可参看村井章介《中世日本的内与外》）与朝鲜王国的外交依赖的就是这些来到九州的五山系禅僧，禅僧们也正是中世东亚海域交流中具有相当汉文素养的一批“非正式外交官”。可见，禅僧不仅仅是依靠佛教信仰的关系网络活跃，与在地外交需求也密不可分。宗教与政治，在前近代从来密不可分。
    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-34&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-35&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        &lt;p&gt;村井章介曾经给其著作《東アジア往還》取副标题为“漢詩と外交”，这里的“外交”事实上指的是中世东亚海域中的“禅僧外交网络”。十三至十四世纪可谓“渡来僧的世纪”，“汉诗”则是禅僧间一种除汉文笔谈和外交文书外互相表达意思的文化趣味。但村井章介的核心关注点并非汉诗的内容，而是这种由禅僧构建起的“非正式外交”网络。&lt;/p&gt;
&lt;p&gt;自遣唐使废止以后，中世日本的对外交流不于王朝国家体制下进行，而是通过受到各权门贵族支持的海商和有识僧侣这些非正式外交途径进行。支撑这两个群体成为跨海境界人的动力既有利益动力和信仰动力，也还有这些作为境界人的海商和僧侣背后连接的京都、镰仓诸权门的人际关系网络；特别是博多的许多作为贸易据点的寺社就是京都寺社的末寺，这些人可以说是以商人和僧人面貌出现的一种有着权门背景的非正式交流人士。&lt;/p&gt;
&lt;p&gt;南宋宁宗朝时期，宋廷依史弥远之奏设立了五山十刹的等级制度。五山十刹是仿照印度释迦牟尼在世时的五精舍和十塔所建立的佛教寺院体制。日本文献《释门事始考》记载：“佛在世时，有鹿苑、祇园、竹林、大林、那烂陀五精舍；佛灭度后，有顶塔、牙塔、齿塔、发塔、爪塔、钵塔、锡塔、瓶塔、盥塔十塔所。宋宁宗时，卫王史弥远奏立五山十刹以准竺国。”其中五山集中于浙东：余杭径山寺，钱塘灵隐寺、净慈寺，宁波天童寺、阿育王寺。五山禅林体制在禅宗东渐的过程中被日本禅宗接受，出现了镰仓五山（建长寺、圆觉寺、寿福寺、净智寺、净妙寺）和京都五山（天龙寺、相国寺、建仁寺、东福寺、万寿寺）。而茫茫大海之间各自的五山禅林的禅僧们空前规模的交流，使两国禅宗界结为一体。村井章介这样形容镰仓后期的东亚海域禅僧交流网络：“武家之都镰仓、公家之都京都、贸易船大量进港的博多这三个城市，相继修建了禅寺，成为与南宋直接连结的极具异国情调的场所”，北条得宗家还邀请了大量的渡来僧前来镰仓。在“蒙古袭来”之后，东亚海域间在事实上进入了一个无序的宽松通交时期，不仅仅是对日贸易的重要港口明州（宁波），其他的港口也有日本船只每年定期进港。村井指出，这种盛况是由于东海航线的活跃化和航海安全度的提高而实现的。桥本雄以“活的唐物”来解释渡来僧的引进：日本的禅僧和法系与江南禅宗界的联系是重要的，仅靠入宋、入元僧很难规整，仍然需要直接接受江南禅宗界僧侣的指点，日本不同权门的权力者就需要通过招募来自江南的高僧，整修禅寺，打造“活的唐物”。但“渡来僧的世纪”也是短暂的，到了明代，渡海僧人急剧减少，日本禅寺的异国风情逐渐淡化，建筑物也随着改建而逐渐趋向和风，也出现了作为日本禅宗独特美学意识的“わび”（幽寂）。村井指出，如果着眼于海域史的视角，那么这种变化产生的原因是明代以后日中禅宗界的交流趋缓，日本禅宗界逐渐自立，国际交流性的色彩淡化了。&lt;/p&gt;

    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-35&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-36&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        &lt;p&gt;渡来僧不只是基于禅宗的理念进行交流，还带来了儒学的理念。如北条时赖与渡来禅僧兀庵普宁交流时，兀庵普宁就指出开悟的基石是“天下”“道”“圣人”这样的儒教思想。室町时期，由禅僧主持、被后世誉为“日本最古的综合大学”的“足利学校”便是室町期儒学教育的一个中心。彼时禅僧的阅读书籍除了被称为内典的佛经之外，还包括称为外典的其他各类书籍，并负责“学术研究”。例如，外交文书集《善邻国宝记》（1466年成书）的编撰者——相国寺住持瑞溪周凤为悼念情同弟子的绵谷周瓞而作的“绵谷和尚行状”中就指出了绵谷治学生涯中受过的教育：既有《汉书》这样的史学古典，也有《易经》这样的卜筮古典，还有各种唐诗宋词。当时许多禅僧都是这样的“复合型学术人才”，因此担负起各种政治和外交上的任务。&lt;/p&gt;
&lt;p&gt;与古代日本相比，中世日本的对外交流往往回避互派正式使节的“正式外交”，而是通过没有正式外交身份的禅僧和海商进行“非正式外交”。禅僧出于自身的基本汉文文化素养，扮演着非正式“外交官”的角色，而“五山禅林”则成为培养中世日本非正式外交官的机构。另外，如桥本雄指出的那样，禅僧比起王朝的显密体制僧，更容易被明朝接受，禅僧也能更好地适应明朝的外交秩序。但桥本同时指出，尤其在室町时期的对外观和中华意识中，禅僧的“汉文脉”和显密僧的“和文脉”两者都存在，因此在重视禅僧外交时不可忽视显密体制的踪迹。池内敏在《絶海の碩学》中也指出，室町时代的京都五山禅林被定位为负责外交文书制作的教养团体。由于外交文书的“解读和编写需要高度的汉诗、汉文知识”，室町政权不仅根据禅僧的语言能力、学力任命外交使节，而且把外交文书的编写业务也交给禅僧。直到近世，“以酊庵轮番僧”仍负责着对马藩的对朝外交文书处理工作。室町幕府和大内氏的对明交涉（遣明使）、大内氏和对马宗氏的对朝交涉，都是临济宗系统的禅僧参与的。&lt;/p&gt;
&lt;p&gt;禅僧外交需要极高的诗文能力，外交谈判成为考验他们诗文能力的场所。这不仅关系到禅僧外交官个人的判断，也关系到国家的尊严。例如，在1587年，朝鲜宣祖王在挑选宣慰使时，强调宣慰使人选的确定不应该讨论官职、官位的高低，而应选派“一代文士”。村井章介指出，之所以朝鲜方面重视“文士”担任使者，就是因为在此之前的日朝外交中，双方有数次因诗文中的言辞影响外交和睦的实例，诗文本就是当时的人情外交中最重要的礼仪表达。合适的诗文唱和表达是加分项，例如，在1580年，博多圣福寺的住持景辙玄苏受委托作为对马宗义智的后见人宗义调（元家督）的使节，前往朝鲜进行外交活动，其创作汉诗中“春帆欲挂朝鲜国，渡口轻吹日本风”也成了日朝外交史上的名句。京都五山出身的禅僧在琉球的首里王府中也负责处理外交事务，首里王府之下也有僧录司，以及圆觉寺（也是第二尚氏王统的菩提所）、相国寺、天龙寺、天王寺、金刚寺等临济宗系的禅林，这些禅僧在中世都替琉球首里王府负责对日外交事务，也与禅僧外交的“五山网络”一体化。尚泰久王时期渡来工匠藤原国善铸造的“万国津梁钟”上的铭文便是琉球相国寺的禅僧溪隐安潜所志。十三至十六世纪东亚海域诸国的沟通，便是这样在“五山网络”中进行着。不过，随着近世东亚海域的规范化，渡来僧的身影在十七世纪中叶以后也逐渐消失了。&lt;/p&gt;

    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-36&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-37&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        &lt;p&gt;“五山禅林网络”联系起了“海东诸国”，而在研究上经常混淆的就是外交主体是谁的问题。室町幕府的“日本国王使”就被不同外交主体所用（大内氏与细川氏），论及“伪使”或其他境界势力更无法用“日本”来概括。以日明勘合贸易为例，粗略来说可分为室町殿的经营和幕府外经营主体（守护和寺社），也就有公方船和非公方船之分，而形式上的交涉朝贡主体是被册封赋予贡贸合法性的“日本国王”，也就是室町将军。1493年明应政变后，室町将军权力的分裂（足利义稙系和足利义澄·义晴系）成为九州地区各势力（特别是大内氏与大友氏）在对外贸易权力发行贸易符验（日明勘合·日朝牙符）的契机。自十五世纪末到十六世纪初，九州产生了诸地方势力将贸易勘合物权化的事态。贸易符验的分散是中世后期日本外交的主轴从幕府外交转向地区交流的契机，也是中世国际关系的结构变动，有鉴于此，考察贸易符验的动态变迁过程和持有主体就显得尤为关键。&lt;/p&gt;
&lt;p&gt;因此，在海域交流史研究中，“非正式外交”也容易带来许多表述上需要注意的问题，包括如何判断和表述行为主体。在此以岩井茂树贸易史研究中的两个典例作说明：一是明中期广州互市贸易中礼部与广东对立的不同意见，二是十八世纪初长崎信牌贸易事件中浙江巡抚与江海关监督的不同意见，这些主体都不能代表“明朝”或“清朝”的意见，只有成为共识的决定才可以认为是（例如康熙帝最终同意了长崎信牌贸易，使得信牌贸易得以体制化）。村井章介同样指出，在中世东亚海域的“非正式外交”中，郑舜功、蒋洲等人是由负责对口事务的杨博和胡宗宪派遣使日的，不能在表述中视为“明朝”派遣的使节，如杨方亨出使大坂城、册封丰臣秀吉的正式使团，才能视作“明朝”派遣的使节。对于中世东亚海域中负责外交的禅僧或非正式使者，辨明其所代表的外交主体并表述明确也是需要重视的。从以上的历史经纬，我们可以理解，信仰和利益是海域交流之间的驱动因素，而政治往往是把信仰和利益连结在一起的最大动力。&lt;/p&gt;

    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-37&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;
&lt;h3 id=&#34;unpacking-the-ageist-myths-of-western-art-西方艺术的年龄歧视神话解析&#34;&gt;Unpacking the Ageist Myths of Western Art 西方艺术的年龄歧视神话解析
&lt;/h3&gt;&lt;div class=&#34;note-card&#34;&gt;
    &lt;div class=&#34;nc-accent&#34;&gt;&lt;/div&gt;

    &lt;div class=&#34;nc-header&#34;&gt;
        &lt;div class=&#34;nc-meta&#34;&gt;
            &lt;span class=&#34;nc-badge&#34;&gt;READING&lt;/span&gt;
            &lt;span class=&#34;nc-date&#34;&gt;2025-09-26&lt;/span&gt;
        &lt;/div&gt; &lt;a href=&#34;https://hyperallergic.com/1043430/larry-silver-unpacking-the-ageist-myths-of-western-art/&#34; target=&#34;_blank&#34; class=&#34;nc-title&#34; title=&#34;访问原文&#34;&gt;
            Unpacking the Ageist Myths of Western Art 西方艺术的年龄歧视神话解析
            &lt;svg class=&#34;nc-link-icon&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
        &lt;/a&gt;
    &lt;/div&gt;

    
    &lt;div class=&#34;nc-context&#34;&gt;
        &lt;div class=&#34;nc-quote-icon&#34;&gt;“&lt;/div&gt;
        &lt;div class=&#34;nc-summary-text&#34;&gt;艺术史学家拉里·西尔弗在其著作《艺术中的晚年》中，探讨了长寿对艺术家（如米开朗琪罗）创作的影响，以及西方艺术中对年老形象的描绘。作品中的老年形象常带有褒贬不一的价值判断，可象征智慧与经验，也可暗示衰败、贪婪甚至邪恶。尽管书中提及的某些作品（如杜勒的《圣哲罗姆》）描绘了老年形象的正面，但如罗马雕塑“老酒鬼”及戈雅的画作则展现了其丑陋或负面的一面。评论认为，该书对老年形象的探讨有其独到之处，但也存在局限，如对非西方艺术和女性艺术家的提及不足。尽管如此，本书成功地将老年人的艺术作品及其重要性带入公众视野，强调了他们晚年创作中蕴含的独特力量和经验。&lt;/div&gt;
    &lt;/div&gt;
    

    
    
    
&lt;/div&gt;

&lt;style&gt;
     
    .note-card {
         
        --nc-bg-card: #ffffff;
        --nc-border: rgba(0,0,0,0.04);
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.08);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.12);
        
        --nc-title: #2c3e50;
        --nc-title-hover: #3a7bd5;
        --nc-meta: #999999;
        
        --nc-bg-context: #f8f9fa;
        --nc-border-context: #e2e8f0;
        --nc-quote-icon: #e2e8f0;
        --nc-text-summary: #555555;
        
        --nc-label-bg: #ffffff;
        --nc-label-text: #2d3748;
        --nc-content-text: #2d3748;
        --nc-link-icon: #cbd5e0;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.1);
        --nc-badge-text: #3a7bd5;

        position: relative;
        background: var(--nc-bg-card);
        border-radius: 12px;
        box-shadow: var(--nc-shadow);
        margin: 2.5rem 0;
        overflow: hidden;
        border: 1px solid var(--nc-border);
        font-family: inherit; 
        transition: transform 0.3s ease, box-shadow 0.3s ease, background 0.3s, border-color 0.3s;
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .note-card {
            --nc-bg-card: #1e1e1e;
            --nc-border: #333333;
            --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
            --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
            
            --nc-title: #f0f0f0;
            --nc-meta: #999999;
            
            --nc-bg-context: #252525;
            --nc-border-context: #444444;
            --nc-quote-icon: #333333;
            --nc-text-summary: #aaaaaa;
            
            --nc-label-bg: #1e1e1e;
            --nc-label-text: #cccccc;
            --nc-content-text: #dddddd;
            --nc-link-icon: #666666;
            
            --nc-badge-bg: rgba(58, 123, 213, 0.2);
        }
    }

    html[data-scheme=&#34;dark&#34;] .note-card {
        --nc-bg-card: #1e1e1e;
        --nc-border: #333333;
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
        
        --nc-title: #f0f0f0;
        --nc-meta: #999999;
        
        --nc-bg-context: #252525;
        --nc-border-context: #444444;
        --nc-quote-icon: #333333;
        --nc-text-summary: #aaaaaa;
        
        --nc-label-bg: #1e1e1e;
        --nc-label-text: #cccccc;
        --nc-content-text: #dddddd;
        --nc-link-icon: #666666;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.2);
    }

    .note-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--nc-shadow-hover);
    }

     
    .nc-accent {
        height: 4px;
        background: linear-gradient(90deg, #3a7bd5, #00d2ff); 
        width: 100%;
    }

     
    .nc-header {
        padding: 24px 28px 10px; 
    }

    .nc-meta {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 10px; 
        font-size: 13px; 
        color: var(--nc-meta);
        font-weight: 600;
        letter-spacing: 1px;
        text-transform: uppercase;
    }

    .nc-badge {
        color: var(--nc-badge-text);
        background: var(--nc-badge-bg);
        padding: 2px 6px;
        border-radius: 4px;
    }

    .nc-title {
        display: block;
        font-size: 2rem; 
        font-weight: 700;
        color: var(--nc-title);
        text-decoration: none;
        line-height: 1.3;
        transition: color 0.2s;
    }

    .nc-title:hover {
        color: var(--nc-title-hover);
    }

    .nc-link-icon {
        width: 20px; 
        height: 20px;
        color: var(--nc-link-icon);
        margin-left: 5px;
        vertical-align: middle;
        transition: color 0.2s;
    }

    .nc-title:hover .nc-link-icon {
        color: var(--nc-title-hover);
    }

     
    .nc-context {
        margin: 12px 28px 24px;
        background: var(--nc-bg-context);
        padding: 20px 24px;
        border-radius: 8px;
        position: relative;
        border-left: 4px solid var(--nc-border-context);
        transition: background 0.3s, border-color 0.3s;
    }

    .nc-quote-icon {
        position: absolute;
        top: 8px;
        left: 10px;
        font-family: serif; 
        font-size: 40px;
        line-height: 1;
        color: var(--nc-quote-icon);
        pointer-events: none;
        transition: color 0.3s;
    }

    .nc-summary-text {
        font-size: 1.7rem; 
        color: var(--nc-text-summary);
        line-height: 1.6;
        font-style: italic;
        position: relative;
        z-index: 1;
        padding-left: 15px; 
        transition: color 0.3s;
    }

     
    .nc-body {
        padding: 0 28px 32px;
        position: relative;
    }

     
    .nc-label {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        font-size: 13px; 
        font-weight: 700;
        color: var(--nc-label-text);
        background: var(--nc-label-bg);
        padding-right: 10px;
        margin-bottom: 12px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
        transition: color 0.3s, background 0.3s;
    }

    .nc-content {
        color: var(--nc-content-text);
        font-size: 1.6rem; 
        line-height: 1.75;
        transition: color 0.3s;
    }

     
    .nc-content p { margin-bottom: 1em; }
    .nc-content p:last-child { margin-bottom: 0; }
    
    .nc-content ul { padding-left: 20px; color: inherit; }
    .nc-content li { margin-bottom: 6px; }
&lt;/style&gt;
&lt;h3 id=&#34;borusan-contemporary-presents-edward-burtynsky-shifting-topography-博鲁桑当代艺术中心呈献爱德华伯汀斯基变化的地形&#34;&gt;Borusan Contemporary Presents Edward Burtynsky: Shifting Topography 博鲁桑当代艺术中心呈献爱德华·伯汀斯基：变化的地形
&lt;/h3&gt;&lt;div class=&#34;note-card&#34;&gt;
    &lt;div class=&#34;nc-accent&#34;&gt;&lt;/div&gt;

    &lt;div class=&#34;nc-header&#34;&gt;
        &lt;div class=&#34;nc-meta&#34;&gt;
            &lt;span class=&#34;nc-badge&#34;&gt;READING&lt;/span&gt;
            &lt;span class=&#34;nc-date&#34;&gt;2025-09-26&lt;/span&gt;
        &lt;/div&gt; &lt;a href=&#34;https://hyperallergic.com/1041977/borusan-contemporary-presents-edward-burtynsky-shifting-topography/&#34; target=&#34;_blank&#34; class=&#34;nc-title&#34; title=&#34;访问原文&#34;&gt;
            Borusan Contemporary Presents Edward Burtynsky: Shifting Topography 博鲁桑当代艺术中心呈献爱德华·伯汀斯基：变化的地形
            &lt;svg class=&#34;nc-link-icon&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
        &lt;/a&gt;
    &lt;/div&gt;

    
    &lt;div class=&#34;nc-context&#34;&gt;
        &lt;div class=&#34;nc-quote-icon&#34;&gt;“&lt;/div&gt;
        &lt;div class=&#34;nc-summary-text&#34;&gt;加拿大艺术家爱德华·伯汀斯基（Edward Burtynsky）在土耳其举办其首次大型个展“地貌变迁”（Shifting Topography）。本次展览汇集了艺术家过去三十年间的摄影作品及新创作。伯汀斯基以其深入自然与人类工业交织点的摄影作品闻名，探索了人类活动对地球的重塑。展览以“侵蚀”、“水与盐”、“非洲研究”、“自然”、“采石场”、“别列兹尼基矿”和“石油”等不同主题，展现了全球环境变迁的宏大图景，并反思了人与地球的关系。&lt;/div&gt;
    &lt;/div&gt;
    

    
    
    
&lt;/div&gt;

&lt;style&gt;
     
    .note-card {
         
        --nc-bg-card: #ffffff;
        --nc-border: rgba(0,0,0,0.04);
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.08);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.12);
        
        --nc-title: #2c3e50;
        --nc-title-hover: #3a7bd5;
        --nc-meta: #999999;
        
        --nc-bg-context: #f8f9fa;
        --nc-border-context: #e2e8f0;
        --nc-quote-icon: #e2e8f0;
        --nc-text-summary: #555555;
        
        --nc-label-bg: #ffffff;
        --nc-label-text: #2d3748;
        --nc-content-text: #2d3748;
        --nc-link-icon: #cbd5e0;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.1);
        --nc-badge-text: #3a7bd5;

        position: relative;
        background: var(--nc-bg-card);
        border-radius: 12px;
        box-shadow: var(--nc-shadow);
        margin: 2.5rem 0;
        overflow: hidden;
        border: 1px solid var(--nc-border);
        font-family: inherit; 
        transition: transform 0.3s ease, box-shadow 0.3s ease, background 0.3s, border-color 0.3s;
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .note-card {
            --nc-bg-card: #1e1e1e;
            --nc-border: #333333;
            --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
            --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
            
            --nc-title: #f0f0f0;
            --nc-meta: #999999;
            
            --nc-bg-context: #252525;
            --nc-border-context: #444444;
            --nc-quote-icon: #333333;
            --nc-text-summary: #aaaaaa;
            
            --nc-label-bg: #1e1e1e;
            --nc-label-text: #cccccc;
            --nc-content-text: #dddddd;
            --nc-link-icon: #666666;
            
            --nc-badge-bg: rgba(58, 123, 213, 0.2);
        }
    }

    html[data-scheme=&#34;dark&#34;] .note-card {
        --nc-bg-card: #1e1e1e;
        --nc-border: #333333;
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
        
        --nc-title: #f0f0f0;
        --nc-meta: #999999;
        
        --nc-bg-context: #252525;
        --nc-border-context: #444444;
        --nc-quote-icon: #333333;
        --nc-text-summary: #aaaaaa;
        
        --nc-label-bg: #1e1e1e;
        --nc-label-text: #cccccc;
        --nc-content-text: #dddddd;
        --nc-link-icon: #666666;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.2);
    }

    .note-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--nc-shadow-hover);
    }

     
    .nc-accent {
        height: 4px;
        background: linear-gradient(90deg, #3a7bd5, #00d2ff); 
        width: 100%;
    }

     
    .nc-header {
        padding: 24px 28px 10px; 
    }

    .nc-meta {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 10px; 
        font-size: 13px; 
        color: var(--nc-meta);
        font-weight: 600;
        letter-spacing: 1px;
        text-transform: uppercase;
    }

    .nc-badge {
        color: var(--nc-badge-text);
        background: var(--nc-badge-bg);
        padding: 2px 6px;
        border-radius: 4px;
    }

    .nc-title {
        display: block;
        font-size: 2rem; 
        font-weight: 700;
        color: var(--nc-title);
        text-decoration: none;
        line-height: 1.3;
        transition: color 0.2s;
    }

    .nc-title:hover {
        color: var(--nc-title-hover);
    }

    .nc-link-icon {
        width: 20px; 
        height: 20px;
        color: var(--nc-link-icon);
        margin-left: 5px;
        vertical-align: middle;
        transition: color 0.2s;
    }

    .nc-title:hover .nc-link-icon {
        color: var(--nc-title-hover);
    }

     
    .nc-context {
        margin: 12px 28px 24px;
        background: var(--nc-bg-context);
        padding: 20px 24px;
        border-radius: 8px;
        position: relative;
        border-left: 4px solid var(--nc-border-context);
        transition: background 0.3s, border-color 0.3s;
    }

    .nc-quote-icon {
        position: absolute;
        top: 8px;
        left: 10px;
        font-family: serif; 
        font-size: 40px;
        line-height: 1;
        color: var(--nc-quote-icon);
        pointer-events: none;
        transition: color 0.3s;
    }

    .nc-summary-text {
        font-size: 1.7rem; 
        color: var(--nc-text-summary);
        line-height: 1.6;
        font-style: italic;
        position: relative;
        z-index: 1;
        padding-left: 15px; 
        transition: color 0.3s;
    }

     
    .nc-body {
        padding: 0 28px 32px;
        position: relative;
    }

     
    .nc-label {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        font-size: 13px; 
        font-weight: 700;
        color: var(--nc-label-text);
        background: var(--nc-label-bg);
        padding-right: 10px;
        margin-bottom: 12px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
        transition: color 0.3s, background 0.3s;
    }

    .nc-content {
        color: var(--nc-content-text);
        font-size: 1.6rem; 
        line-height: 1.75;
        transition: color 0.3s;
    }

     
    .nc-content p { margin-bottom: 1em; }
    .nc-content p:last-child { margin-bottom: 0; }
    
    .nc-content ul { padding-left: 20px; color: inherit; }
    .nc-content li { margin-bottom: 6px; }
&lt;/style&gt;
&lt;h3 id=&#34;未见于史载的西周古国倗国最近又确认一座国君墓&#34;&gt;未见于史载的西周古国倗国，最近又确认一座国君墓
&lt;/h3&gt;&lt;div class=&#34;note-card&#34;&gt;
    &lt;div class=&#34;nc-accent&#34;&gt;&lt;/div&gt;

    &lt;div class=&#34;nc-header&#34;&gt;
        &lt;div class=&#34;nc-meta&#34;&gt;
            &lt;span class=&#34;nc-badge&#34;&gt;READING&lt;/span&gt;
            &lt;span class=&#34;nc-date&#34;&gt;2025-09-26&lt;/span&gt;
        &lt;/div&gt; &lt;a href=&#34;https://m.thepaper.cn/detail/31625609&#34; target=&#34;_blank&#34; class=&#34;nc-title&#34; title=&#34;访问原文&#34;&gt;
            未见于史载的西周古国倗国，最近又确认一座国君墓
            &lt;svg class=&#34;nc-link-icon&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
        &lt;/a&gt;
    &lt;/div&gt;

    
    &lt;div class=&#34;nc-context&#34;&gt;
        &lt;div class=&#34;nc-quote-icon&#34;&gt;“&lt;/div&gt;
        &lt;div class=&#34;nc-summary-text&#34;&gt;山西绛县横水西周墓地M1006的发掘资料公布，确认该墓墓主为西周时期一个史书中未记载的诸侯国——倗国的国君，墓葬年代为西周中期偏晚。此前，同墓地M1011已发现倗国国君墓。M1006墓葬规格高，出土器物1007件，铜礼器组合反映了西周早、中期特点。墓中铭文显示倗国与芮国存在世代联姻关系，这是一种巩固政治关系的常见手段。此次发现为研究倗国历史及西周诸侯国关系提供了重要实物证据。&lt;/div&gt;
    &lt;/div&gt;
    

    
    
    
&lt;/div&gt;

&lt;style&gt;
     
    .note-card {
         
        --nc-bg-card: #ffffff;
        --nc-border: rgba(0,0,0,0.04);
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.08);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.12);
        
        --nc-title: #2c3e50;
        --nc-title-hover: #3a7bd5;
        --nc-meta: #999999;
        
        --nc-bg-context: #f8f9fa;
        --nc-border-context: #e2e8f0;
        --nc-quote-icon: #e2e8f0;
        --nc-text-summary: #555555;
        
        --nc-label-bg: #ffffff;
        --nc-label-text: #2d3748;
        --nc-content-text: #2d3748;
        --nc-link-icon: #cbd5e0;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.1);
        --nc-badge-text: #3a7bd5;

        position: relative;
        background: var(--nc-bg-card);
        border-radius: 12px;
        box-shadow: var(--nc-shadow);
        margin: 2.5rem 0;
        overflow: hidden;
        border: 1px solid var(--nc-border);
        font-family: inherit; 
        transition: transform 0.3s ease, box-shadow 0.3s ease, background 0.3s, border-color 0.3s;
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .note-card {
            --nc-bg-card: #1e1e1e;
            --nc-border: #333333;
            --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
            --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
            
            --nc-title: #f0f0f0;
            --nc-meta: #999999;
            
            --nc-bg-context: #252525;
            --nc-border-context: #444444;
            --nc-quote-icon: #333333;
            --nc-text-summary: #aaaaaa;
            
            --nc-label-bg: #1e1e1e;
            --nc-label-text: #cccccc;
            --nc-content-text: #dddddd;
            --nc-link-icon: #666666;
            
            --nc-badge-bg: rgba(58, 123, 213, 0.2);
        }
    }

    html[data-scheme=&#34;dark&#34;] .note-card {
        --nc-bg-card: #1e1e1e;
        --nc-border: #333333;
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
        
        --nc-title: #f0f0f0;
        --nc-meta: #999999;
        
        --nc-bg-context: #252525;
        --nc-border-context: #444444;
        --nc-quote-icon: #333333;
        --nc-text-summary: #aaaaaa;
        
        --nc-label-bg: #1e1e1e;
        --nc-label-text: #cccccc;
        --nc-content-text: #dddddd;
        --nc-link-icon: #666666;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.2);
    }

    .note-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--nc-shadow-hover);
    }

     
    .nc-accent {
        height: 4px;
        background: linear-gradient(90deg, #3a7bd5, #00d2ff); 
        width: 100%;
    }

     
    .nc-header {
        padding: 24px 28px 10px; 
    }

    .nc-meta {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 10px; 
        font-size: 13px; 
        color: var(--nc-meta);
        font-weight: 600;
        letter-spacing: 1px;
        text-transform: uppercase;
    }

    .nc-badge {
        color: var(--nc-badge-text);
        background: var(--nc-badge-bg);
        padding: 2px 6px;
        border-radius: 4px;
    }

    .nc-title {
        display: block;
        font-size: 2rem; 
        font-weight: 700;
        color: var(--nc-title);
        text-decoration: none;
        line-height: 1.3;
        transition: color 0.2s;
    }

    .nc-title:hover {
        color: var(--nc-title-hover);
    }

    .nc-link-icon {
        width: 20px; 
        height: 20px;
        color: var(--nc-link-icon);
        margin-left: 5px;
        vertical-align: middle;
        transition: color 0.2s;
    }

    .nc-title:hover .nc-link-icon {
        color: var(--nc-title-hover);
    }

     
    .nc-context {
        margin: 12px 28px 24px;
        background: var(--nc-bg-context);
        padding: 20px 24px;
        border-radius: 8px;
        position: relative;
        border-left: 4px solid var(--nc-border-context);
        transition: background 0.3s, border-color 0.3s;
    }

    .nc-quote-icon {
        position: absolute;
        top: 8px;
        left: 10px;
        font-family: serif; 
        font-size: 40px;
        line-height: 1;
        color: var(--nc-quote-icon);
        pointer-events: none;
        transition: color 0.3s;
    }

    .nc-summary-text {
        font-size: 1.7rem; 
        color: var(--nc-text-summary);
        line-height: 1.6;
        font-style: italic;
        position: relative;
        z-index: 1;
        padding-left: 15px; 
        transition: color 0.3s;
    }

     
    .nc-body {
        padding: 0 28px 32px;
        position: relative;
    }

     
    .nc-label {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        font-size: 13px; 
        font-weight: 700;
        color: var(--nc-label-text);
        background: var(--nc-label-bg);
        padding-right: 10px;
        margin-bottom: 12px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
        transition: color 0.3s, background 0.3s;
    }

    .nc-content {
        color: var(--nc-content-text);
        font-size: 1.6rem; 
        line-height: 1.75;
        transition: color 0.3s;
    }

     
    .nc-content p { margin-bottom: 1em; }
    .nc-content p:last-child { margin-bottom: 0; }
    
    .nc-content ul { padding-left: 20px; color: inherit; }
    .nc-content li { margin-bottom: 6px; }
&lt;/style&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-41&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        倗（péng）国，是一个在传世历史文献中完全没有记载的西周时期诸侯国，它的存在、它的文化、它的历史，完全依赖于现代考古学的发现才得以重见天日。9月17日，山西省考古研究院正式公布了山西省绛县横水西周墓地M1006的发掘资料，确认该墓墓主为一代倗国国君，墓葬年代属西周中期偏晚阶段。此前的2006年，考古学家在此曾发现了刻有“倗伯”和“倗伯乍毕姬宝旅鼎”等铭文的倗国国君墓。
    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-41&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;
&lt;h3 id=&#34;stephen-westfalls-avian-abstractions-斯蒂芬韦斯特福尔的鸟类抽象画&#34;&gt;Stephen Westfall’s Avian Abstractions 斯蒂芬·韦斯特福尔的鸟类抽象画
&lt;/h3&gt;&lt;div class=&#34;note-card&#34;&gt;
    &lt;div class=&#34;nc-accent&#34;&gt;&lt;/div&gt;

    &lt;div class=&#34;nc-header&#34;&gt;
        &lt;div class=&#34;nc-meta&#34;&gt;
            &lt;span class=&#34;nc-badge&#34;&gt;READING&lt;/span&gt;
            &lt;span class=&#34;nc-date&#34;&gt;2025-09-26&lt;/span&gt;
        &lt;/div&gt; &lt;a href=&#34;https://hyperallergic.com/1042096/stephen-westfall-avian-abstractions-alexandre-gallery/&#34; target=&#34;_blank&#34; class=&#34;nc-title&#34; title=&#34;访问原文&#34;&gt;
            Stephen Westfall’s Avian Abstractions 斯蒂芬·韦斯特福尔的鸟类抽象画
            &lt;svg class=&#34;nc-link-icon&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
        &lt;/a&gt;
    &lt;/div&gt;

    
    &lt;div class=&#34;nc-context&#34;&gt;
        &lt;div class=&#34;nc-quote-icon&#34;&gt;“&lt;/div&gt;
        &lt;div class=&#34;nc-summary-text&#34;&gt;斯蒂芬·韦斯特法尔（Stephen Westfall）的“禽类抽象”画展（Ornithology）展出了他最新的十幅油画和醇酸树脂画布作品，以及七幅纸本设色作品。他的作品受到纳瓦霍地毯、沃克·埃文斯和纳斯卡计分板等多种元素的影响，并尝试在几何抽象中打破传统网格的规律性。画展的标题“禽类抽象”有三层含义：致敬爵士音乐家查理·帕克（“Bird”）、作品中代表抽象鸟嘴的三角形元素，以及抽象表现主义画家巴尼特·纽曼关于美学的名言。韦斯特法尔的作品通过不对称的组合、分割与融合的张力，以及他“朱朱（献给韦恩·肖特）”和“禽类抽象”等新作中对色彩和构图的自由即兴处理，展现了其艺术生涯的突破性进展。&lt;/div&gt;
    &lt;/div&gt;
    

    
    
    
&lt;/div&gt;

&lt;style&gt;
     
    .note-card {
         
        --nc-bg-card: #ffffff;
        --nc-border: rgba(0,0,0,0.04);
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.08);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.12);
        
        --nc-title: #2c3e50;
        --nc-title-hover: #3a7bd5;
        --nc-meta: #999999;
        
        --nc-bg-context: #f8f9fa;
        --nc-border-context: #e2e8f0;
        --nc-quote-icon: #e2e8f0;
        --nc-text-summary: #555555;
        
        --nc-label-bg: #ffffff;
        --nc-label-text: #2d3748;
        --nc-content-text: #2d3748;
        --nc-link-icon: #cbd5e0;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.1);
        --nc-badge-text: #3a7bd5;

        position: relative;
        background: var(--nc-bg-card);
        border-radius: 12px;
        box-shadow: var(--nc-shadow);
        margin: 2.5rem 0;
        overflow: hidden;
        border: 1px solid var(--nc-border);
        font-family: inherit; 
        transition: transform 0.3s ease, box-shadow 0.3s ease, background 0.3s, border-color 0.3s;
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .note-card {
            --nc-bg-card: #1e1e1e;
            --nc-border: #333333;
            --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
            --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
            
            --nc-title: #f0f0f0;
            --nc-meta: #999999;
            
            --nc-bg-context: #252525;
            --nc-border-context: #444444;
            --nc-quote-icon: #333333;
            --nc-text-summary: #aaaaaa;
            
            --nc-label-bg: #1e1e1e;
            --nc-label-text: #cccccc;
            --nc-content-text: #dddddd;
            --nc-link-icon: #666666;
            
            --nc-badge-bg: rgba(58, 123, 213, 0.2);
        }
    }

    html[data-scheme=&#34;dark&#34;] .note-card {
        --nc-bg-card: #1e1e1e;
        --nc-border: #333333;
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
        
        --nc-title: #f0f0f0;
        --nc-meta: #999999;
        
        --nc-bg-context: #252525;
        --nc-border-context: #444444;
        --nc-quote-icon: #333333;
        --nc-text-summary: #aaaaaa;
        
        --nc-label-bg: #1e1e1e;
        --nc-label-text: #cccccc;
        --nc-content-text: #dddddd;
        --nc-link-icon: #666666;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.2);
    }

    .note-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--nc-shadow-hover);
    }

     
    .nc-accent {
        height: 4px;
        background: linear-gradient(90deg, #3a7bd5, #00d2ff); 
        width: 100%;
    }

     
    .nc-header {
        padding: 24px 28px 10px; 
    }

    .nc-meta {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 10px; 
        font-size: 13px; 
        color: var(--nc-meta);
        font-weight: 600;
        letter-spacing: 1px;
        text-transform: uppercase;
    }

    .nc-badge {
        color: var(--nc-badge-text);
        background: var(--nc-badge-bg);
        padding: 2px 6px;
        border-radius: 4px;
    }

    .nc-title {
        display: block;
        font-size: 2rem; 
        font-weight: 700;
        color: var(--nc-title);
        text-decoration: none;
        line-height: 1.3;
        transition: color 0.2s;
    }

    .nc-title:hover {
        color: var(--nc-title-hover);
    }

    .nc-link-icon {
        width: 20px; 
        height: 20px;
        color: var(--nc-link-icon);
        margin-left: 5px;
        vertical-align: middle;
        transition: color 0.2s;
    }

    .nc-title:hover .nc-link-icon {
        color: var(--nc-title-hover);
    }

     
    .nc-context {
        margin: 12px 28px 24px;
        background: var(--nc-bg-context);
        padding: 20px 24px;
        border-radius: 8px;
        position: relative;
        border-left: 4px solid var(--nc-border-context);
        transition: background 0.3s, border-color 0.3s;
    }

    .nc-quote-icon {
        position: absolute;
        top: 8px;
        left: 10px;
        font-family: serif; 
        font-size: 40px;
        line-height: 1;
        color: var(--nc-quote-icon);
        pointer-events: none;
        transition: color 0.3s;
    }

    .nc-summary-text {
        font-size: 1.7rem; 
        color: var(--nc-text-summary);
        line-height: 1.6;
        font-style: italic;
        position: relative;
        z-index: 1;
        padding-left: 15px; 
        transition: color 0.3s;
    }

     
    .nc-body {
        padding: 0 28px 32px;
        position: relative;
    }

     
    .nc-label {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        font-size: 13px; 
        font-weight: 700;
        color: var(--nc-label-text);
        background: var(--nc-label-bg);
        padding-right: 10px;
        margin-bottom: 12px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
        transition: color 0.3s, background 0.3s;
    }

    .nc-content {
        color: var(--nc-content-text);
        font-size: 1.6rem; 
        line-height: 1.75;
        transition: color 0.3s;
    }

     
    .nc-content p { margin-bottom: 1em; }
    .nc-content p:last-child { margin-bottom: 0; }
    
    .nc-content ul { padding-left: 20px; color: inherit; }
    .nc-content li { margin-bottom: 6px; }
&lt;/style&gt;
&lt;h3 id=&#34;惠春寿评多元社会中的正义多元社会正义何为&#34;&gt;惠春寿评《多元社会中的正义》｜多元社会，正义何为？
&lt;/h3&gt;&lt;div class=&#34;note-card&#34;&gt;
    &lt;div class=&#34;nc-accent&#34;&gt;&lt;/div&gt;

    &lt;div class=&#34;nc-header&#34;&gt;
        &lt;div class=&#34;nc-meta&#34;&gt;
            &lt;span class=&#34;nc-badge&#34;&gt;READING&lt;/span&gt;
            &lt;span class=&#34;nc-date&#34;&gt;2025-09-26&lt;/span&gt;
        &lt;/div&gt; &lt;a href=&#34;https://www.thepaper.cn/newsDetail_forward_31617572&#34; target=&#34;_blank&#34; class=&#34;nc-title&#34; title=&#34;访问原文&#34;&gt;
            惠春寿评《多元社会中的正义》｜多元社会，正义何为？
            &lt;svg class=&#34;nc-link-icon&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
        &lt;/a&gt;
    &lt;/div&gt;

    
    &lt;div class=&#34;nc-context&#34;&gt;
        &lt;div class=&#34;nc-quote-icon&#34;&gt;“&lt;/div&gt;
        &lt;div class=&#34;nc-summary-text&#34;&gt;杰拉德·高斯在其著作《多元社会中的正义》中，挑战了当代政治哲学对“正义”的普遍追求，认为其可能导致“理想的暴政”。他批评罗尔斯式的理想正义理论脱离实际，且其平等主义原则（如财富再分配）并非所有人都接受。高斯结合了“非理想理论”与“自由至上主义”，主张在多元社会中，公共理性应允许个体基于不同私人视角进行探索，不应强求共识，而是以保护基本自由为目标，推崇一个开放而非强制性的社会。他认为，与其追求某种特定的正义理想，不如采取“多元一体”的开放态度，即“多元社会，正义无为”，这是一种对强制性正义理想的反思。&lt;/div&gt;
    &lt;/div&gt;
    

    
    
    
&lt;/div&gt;

&lt;style&gt;
     
    .note-card {
         
        --nc-bg-card: #ffffff;
        --nc-border: rgba(0,0,0,0.04);
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.08);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.12);
        
        --nc-title: #2c3e50;
        --nc-title-hover: #3a7bd5;
        --nc-meta: #999999;
        
        --nc-bg-context: #f8f9fa;
        --nc-border-context: #e2e8f0;
        --nc-quote-icon: #e2e8f0;
        --nc-text-summary: #555555;
        
        --nc-label-bg: #ffffff;
        --nc-label-text: #2d3748;
        --nc-content-text: #2d3748;
        --nc-link-icon: #cbd5e0;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.1);
        --nc-badge-text: #3a7bd5;

        position: relative;
        background: var(--nc-bg-card);
        border-radius: 12px;
        box-shadow: var(--nc-shadow);
        margin: 2.5rem 0;
        overflow: hidden;
        border: 1px solid var(--nc-border);
        font-family: inherit; 
        transition: transform 0.3s ease, box-shadow 0.3s ease, background 0.3s, border-color 0.3s;
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .note-card {
            --nc-bg-card: #1e1e1e;
            --nc-border: #333333;
            --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
            --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
            
            --nc-title: #f0f0f0;
            --nc-meta: #999999;
            
            --nc-bg-context: #252525;
            --nc-border-context: #444444;
            --nc-quote-icon: #333333;
            --nc-text-summary: #aaaaaa;
            
            --nc-label-bg: #1e1e1e;
            --nc-label-text: #cccccc;
            --nc-content-text: #dddddd;
            --nc-link-icon: #666666;
            
            --nc-badge-bg: rgba(58, 123, 213, 0.2);
        }
    }

    html[data-scheme=&#34;dark&#34;] .note-card {
        --nc-bg-card: #1e1e1e;
        --nc-border: #333333;
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
        
        --nc-title: #f0f0f0;
        --nc-meta: #999999;
        
        --nc-bg-context: #252525;
        --nc-border-context: #444444;
        --nc-quote-icon: #333333;
        --nc-text-summary: #aaaaaa;
        
        --nc-label-bg: #1e1e1e;
        --nc-label-text: #cccccc;
        --nc-content-text: #dddddd;
        --nc-link-icon: #666666;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.2);
    }

    .note-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--nc-shadow-hover);
    }

     
    .nc-accent {
        height: 4px;
        background: linear-gradient(90deg, #3a7bd5, #00d2ff); 
        width: 100%;
    }

     
    .nc-header {
        padding: 24px 28px 10px; 
    }

    .nc-meta {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 10px; 
        font-size: 13px; 
        color: var(--nc-meta);
        font-weight: 600;
        letter-spacing: 1px;
        text-transform: uppercase;
    }

    .nc-badge {
        color: var(--nc-badge-text);
        background: var(--nc-badge-bg);
        padding: 2px 6px;
        border-radius: 4px;
    }

    .nc-title {
        display: block;
        font-size: 2rem; 
        font-weight: 700;
        color: var(--nc-title);
        text-decoration: none;
        line-height: 1.3;
        transition: color 0.2s;
    }

    .nc-title:hover {
        color: var(--nc-title-hover);
    }

    .nc-link-icon {
        width: 20px; 
        height: 20px;
        color: var(--nc-link-icon);
        margin-left: 5px;
        vertical-align: middle;
        transition: color 0.2s;
    }

    .nc-title:hover .nc-link-icon {
        color: var(--nc-title-hover);
    }

     
    .nc-context {
        margin: 12px 28px 24px;
        background: var(--nc-bg-context);
        padding: 20px 24px;
        border-radius: 8px;
        position: relative;
        border-left: 4px solid var(--nc-border-context);
        transition: background 0.3s, border-color 0.3s;
    }

    .nc-quote-icon {
        position: absolute;
        top: 8px;
        left: 10px;
        font-family: serif; 
        font-size: 40px;
        line-height: 1;
        color: var(--nc-quote-icon);
        pointer-events: none;
        transition: color 0.3s;
    }

    .nc-summary-text {
        font-size: 1.7rem; 
        color: var(--nc-text-summary);
        line-height: 1.6;
        font-style: italic;
        position: relative;
        z-index: 1;
        padding-left: 15px; 
        transition: color 0.3s;
    }

     
    .nc-body {
        padding: 0 28px 32px;
        position: relative;
    }

     
    .nc-label {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        font-size: 13px; 
        font-weight: 700;
        color: var(--nc-label-text);
        background: var(--nc-label-bg);
        padding-right: 10px;
        margin-bottom: 12px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
        transition: color 0.3s, background 0.3s;
    }

    .nc-content {
        color: var(--nc-content-text);
        font-size: 1.6rem; 
        line-height: 1.75;
        transition: color 0.3s;
    }

     
    .nc-content p { margin-bottom: 1em; }
    .nc-content p:last-child { margin-bottom: 0; }
    
    .nc-content ul { padding-left: 20px; color: inherit; }
    .nc-content li { margin-bottom: 6px; }
&lt;/style&gt;
&lt;h3 id=&#34;他是路易十三的御用画家他的烛光曾被遗忘了百余年&#34;&gt;他是路易十三的御用画家，他的烛光曾被遗忘了百余年
&lt;/h3&gt;&lt;div class=&#34;note-card&#34;&gt;
    &lt;div class=&#34;nc-accent&#34;&gt;&lt;/div&gt;

    &lt;div class=&#34;nc-header&#34;&gt;
        &lt;div class=&#34;nc-meta&#34;&gt;
            &lt;span class=&#34;nc-badge&#34;&gt;READING&lt;/span&gt;
            &lt;span class=&#34;nc-date&#34;&gt;2025-09-26&lt;/span&gt;
        &lt;/div&gt; &lt;a href=&#34;https://m.thepaper.cn/detail/31618764&#34; target=&#34;_blank&#34; class=&#34;nc-title&#34; title=&#34;访问原文&#34;&gt;
            他是路易十三的御用画家，他的烛光曾被遗忘了百余年
            &lt;svg class=&#34;nc-link-icon&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
        &lt;/a&gt;
    &lt;/div&gt;

    
    &lt;div class=&#34;nc-context&#34;&gt;
        &lt;div class=&#34;nc-quote-icon&#34;&gt;“&lt;/div&gt;
        &lt;div class=&#34;nc-summary-text&#34;&gt;乔治·德·拉图尔，17世纪法国“明暗对比大师”，曾是路易十三的御用画家。其作品以独特的烛光夜景和精湛的光影运用闻名，将日常生活转化为精神体验。拉图尔生前享有盛名，但去世后曾被遗忘百余年，直到20世纪初才重获关注。现正在巴黎雅克马尔-安德烈博物馆举办的大型回顾展，汇集了他创作的23件作品，几乎涵盖了学界公认的拉图尔真迹的绝大部分。展览深入探索了他如何通过光影和简洁构图赋予画作情感张力与神秘感，同时也展示了他对后世电影艺术的影响。&lt;/div&gt;
    &lt;/div&gt;
    

    
    
    
&lt;/div&gt;

&lt;style&gt;
     
    .note-card {
         
        --nc-bg-card: #ffffff;
        --nc-border: rgba(0,0,0,0.04);
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.08);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.12);
        
        --nc-title: #2c3e50;
        --nc-title-hover: #3a7bd5;
        --nc-meta: #999999;
        
        --nc-bg-context: #f8f9fa;
        --nc-border-context: #e2e8f0;
        --nc-quote-icon: #e2e8f0;
        --nc-text-summary: #555555;
        
        --nc-label-bg: #ffffff;
        --nc-label-text: #2d3748;
        --nc-content-text: #2d3748;
        --nc-link-icon: #cbd5e0;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.1);
        --nc-badge-text: #3a7bd5;

        position: relative;
        background: var(--nc-bg-card);
        border-radius: 12px;
        box-shadow: var(--nc-shadow);
        margin: 2.5rem 0;
        overflow: hidden;
        border: 1px solid var(--nc-border);
        font-family: inherit; 
        transition: transform 0.3s ease, box-shadow 0.3s ease, background 0.3s, border-color 0.3s;
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .note-card {
            --nc-bg-card: #1e1e1e;
            --nc-border: #333333;
            --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
            --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
            
            --nc-title: #f0f0f0;
            --nc-meta: #999999;
            
            --nc-bg-context: #252525;
            --nc-border-context: #444444;
            --nc-quote-icon: #333333;
            --nc-text-summary: #aaaaaa;
            
            --nc-label-bg: #1e1e1e;
            --nc-label-text: #cccccc;
            --nc-content-text: #dddddd;
            --nc-link-icon: #666666;
            
            --nc-badge-bg: rgba(58, 123, 213, 0.2);
        }
    }

    html[data-scheme=&#34;dark&#34;] .note-card {
        --nc-bg-card: #1e1e1e;
        --nc-border: #333333;
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
        
        --nc-title: #f0f0f0;
        --nc-meta: #999999;
        
        --nc-bg-context: #252525;
        --nc-border-context: #444444;
        --nc-quote-icon: #333333;
        --nc-text-summary: #aaaaaa;
        
        --nc-label-bg: #1e1e1e;
        --nc-label-text: #cccccc;
        --nc-content-text: #dddddd;
        --nc-link-icon: #666666;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.2);
    }

    .note-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--nc-shadow-hover);
    }

     
    .nc-accent {
        height: 4px;
        background: linear-gradient(90deg, #3a7bd5, #00d2ff); 
        width: 100%;
    }

     
    .nc-header {
        padding: 24px 28px 10px; 
    }

    .nc-meta {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 10px; 
        font-size: 13px; 
        color: var(--nc-meta);
        font-weight: 600;
        letter-spacing: 1px;
        text-transform: uppercase;
    }

    .nc-badge {
        color: var(--nc-badge-text);
        background: var(--nc-badge-bg);
        padding: 2px 6px;
        border-radius: 4px;
    }

    .nc-title {
        display: block;
        font-size: 2rem; 
        font-weight: 700;
        color: var(--nc-title);
        text-decoration: none;
        line-height: 1.3;
        transition: color 0.2s;
    }

    .nc-title:hover {
        color: var(--nc-title-hover);
    }

    .nc-link-icon {
        width: 20px; 
        height: 20px;
        color: var(--nc-link-icon);
        margin-left: 5px;
        vertical-align: middle;
        transition: color 0.2s;
    }

    .nc-title:hover .nc-link-icon {
        color: var(--nc-title-hover);
    }

     
    .nc-context {
        margin: 12px 28px 24px;
        background: var(--nc-bg-context);
        padding: 20px 24px;
        border-radius: 8px;
        position: relative;
        border-left: 4px solid var(--nc-border-context);
        transition: background 0.3s, border-color 0.3s;
    }

    .nc-quote-icon {
        position: absolute;
        top: 8px;
        left: 10px;
        font-family: serif; 
        font-size: 40px;
        line-height: 1;
        color: var(--nc-quote-icon);
        pointer-events: none;
        transition: color 0.3s;
    }

    .nc-summary-text {
        font-size: 1.7rem; 
        color: var(--nc-text-summary);
        line-height: 1.6;
        font-style: italic;
        position: relative;
        z-index: 1;
        padding-left: 15px; 
        transition: color 0.3s;
    }

     
    .nc-body {
        padding: 0 28px 32px;
        position: relative;
    }

     
    .nc-label {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        font-size: 13px; 
        font-weight: 700;
        color: var(--nc-label-text);
        background: var(--nc-label-bg);
        padding-right: 10px;
        margin-bottom: 12px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
        transition: color 0.3s, background 0.3s;
    }

    .nc-content {
        color: var(--nc-content-text);
        font-size: 1.6rem; 
        line-height: 1.75;
        transition: color 0.3s;
    }

     
    .nc-content p { margin-bottom: 1em; }
    .nc-content p:last-child { margin-bottom: 0; }
    
    .nc-content ul { padding-left: 20px; color: inherit; }
    .nc-content li { margin-bottom: 6px; }
&lt;/style&gt;
&lt;h3 id=&#34;曼雷的人体小提琴又在展出了&#34;&gt;曼·雷的人体小提琴又在展出了
&lt;/h3&gt;&lt;div class=&#34;note-card&#34;&gt;
    &lt;div class=&#34;nc-accent&#34;&gt;&lt;/div&gt;

    &lt;div class=&#34;nc-header&#34;&gt;
        &lt;div class=&#34;nc-meta&#34;&gt;
            &lt;span class=&#34;nc-badge&#34;&gt;READING&lt;/span&gt;
            &lt;span class=&#34;nc-date&#34;&gt;2025-09-26&lt;/span&gt;
        &lt;/div&gt; &lt;a href=&#34;https://m.thepaper.cn/detail/31617639&#34; target=&#34;_blank&#34; class=&#34;nc-title&#34; title=&#34;访问原文&#34;&gt;
            曼·雷的人体小提琴又在展出了
            &lt;svg class=&#34;nc-link-icon&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
        &lt;/a&gt;
    &lt;/div&gt;

    
    &lt;div class=&#34;nc-context&#34;&gt;
        &lt;div class=&#34;nc-quote-icon&#34;&gt;“&lt;/div&gt;
        &lt;div class=&#34;nc-summary-text&#34;&gt;纽约大都会艺术博物馆展出曼·雷（Man Ray）的作品，重点展示了他标志性的“物影摄影”（Rayographs）以及艺术史上最昂贵的照片《安格尔的小提琴》。展览揭示了曼·雷如何通过“用光创作”来探索摄影的无限可能。此次展览汇集了他创作生涯中的关键作品，包括由收藏家普利兹克捐赠的大量曼·雷及其同代艺术家的作品。尽管“物影摄影”并非曼·雷首创，但他将其发展为一种独特的艺术形式，将日常物品赋予超现实的魅力。展览还探讨了他与其他艺术家在类似技术上的探索，以及他对创作的创新与严谨。&lt;/div&gt;
    &lt;/div&gt;
    

    
    
    
&lt;/div&gt;

&lt;style&gt;
     
    .note-card {
         
        --nc-bg-card: #ffffff;
        --nc-border: rgba(0,0,0,0.04);
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.08);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.12);
        
        --nc-title: #2c3e50;
        --nc-title-hover: #3a7bd5;
        --nc-meta: #999999;
        
        --nc-bg-context: #f8f9fa;
        --nc-border-context: #e2e8f0;
        --nc-quote-icon: #e2e8f0;
        --nc-text-summary: #555555;
        
        --nc-label-bg: #ffffff;
        --nc-label-text: #2d3748;
        --nc-content-text: #2d3748;
        --nc-link-icon: #cbd5e0;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.1);
        --nc-badge-text: #3a7bd5;

        position: relative;
        background: var(--nc-bg-card);
        border-radius: 12px;
        box-shadow: var(--nc-shadow);
        margin: 2.5rem 0;
        overflow: hidden;
        border: 1px solid var(--nc-border);
        font-family: inherit; 
        transition: transform 0.3s ease, box-shadow 0.3s ease, background 0.3s, border-color 0.3s;
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .note-card {
            --nc-bg-card: #1e1e1e;
            --nc-border: #333333;
            --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
            --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
            
            --nc-title: #f0f0f0;
            --nc-meta: #999999;
            
            --nc-bg-context: #252525;
            --nc-border-context: #444444;
            --nc-quote-icon: #333333;
            --nc-text-summary: #aaaaaa;
            
            --nc-label-bg: #1e1e1e;
            --nc-label-text: #cccccc;
            --nc-content-text: #dddddd;
            --nc-link-icon: #666666;
            
            --nc-badge-bg: rgba(58, 123, 213, 0.2);
        }
    }

    html[data-scheme=&#34;dark&#34;] .note-card {
        --nc-bg-card: #1e1e1e;
        --nc-border: #333333;
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
        
        --nc-title: #f0f0f0;
        --nc-meta: #999999;
        
        --nc-bg-context: #252525;
        --nc-border-context: #444444;
        --nc-quote-icon: #333333;
        --nc-text-summary: #aaaaaa;
        
        --nc-label-bg: #1e1e1e;
        --nc-label-text: #cccccc;
        --nc-content-text: #dddddd;
        --nc-link-icon: #666666;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.2);
    }

    .note-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--nc-shadow-hover);
    }

     
    .nc-accent {
        height: 4px;
        background: linear-gradient(90deg, #3a7bd5, #00d2ff); 
        width: 100%;
    }

     
    .nc-header {
        padding: 24px 28px 10px; 
    }

    .nc-meta {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 10px; 
        font-size: 13px; 
        color: var(--nc-meta);
        font-weight: 600;
        letter-spacing: 1px;
        text-transform: uppercase;
    }

    .nc-badge {
        color: var(--nc-badge-text);
        background: var(--nc-badge-bg);
        padding: 2px 6px;
        border-radius: 4px;
    }

    .nc-title {
        display: block;
        font-size: 2rem; 
        font-weight: 700;
        color: var(--nc-title);
        text-decoration: none;
        line-height: 1.3;
        transition: color 0.2s;
    }

    .nc-title:hover {
        color: var(--nc-title-hover);
    }

    .nc-link-icon {
        width: 20px; 
        height: 20px;
        color: var(--nc-link-icon);
        margin-left: 5px;
        vertical-align: middle;
        transition: color 0.2s;
    }

    .nc-title:hover .nc-link-icon {
        color: var(--nc-title-hover);
    }

     
    .nc-context {
        margin: 12px 28px 24px;
        background: var(--nc-bg-context);
        padding: 20px 24px;
        border-radius: 8px;
        position: relative;
        border-left: 4px solid var(--nc-border-context);
        transition: background 0.3s, border-color 0.3s;
    }

    .nc-quote-icon {
        position: absolute;
        top: 8px;
        left: 10px;
        font-family: serif; 
        font-size: 40px;
        line-height: 1;
        color: var(--nc-quote-icon);
        pointer-events: none;
        transition: color 0.3s;
    }

    .nc-summary-text {
        font-size: 1.7rem; 
        color: var(--nc-text-summary);
        line-height: 1.6;
        font-style: italic;
        position: relative;
        z-index: 1;
        padding-left: 15px; 
        transition: color 0.3s;
    }

     
    .nc-body {
        padding: 0 28px 32px;
        position: relative;
    }

     
    .nc-label {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        font-size: 13px; 
        font-weight: 700;
        color: var(--nc-label-text);
        background: var(--nc-label-bg);
        padding-right: 10px;
        margin-bottom: 12px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
        transition: color 0.3s, background 0.3s;
    }

    .nc-content {
        color: var(--nc-content-text);
        font-size: 1.6rem; 
        line-height: 1.75;
        transition: color 0.3s;
    }

     
    .nc-content p { margin-bottom: 1em; }
    .nc-content p:last-child { margin-bottom: 0; }
    
    .nc-content ul { padding-left: 20px; color: inherit; }
    .nc-content li { margin-bottom: 6px; }
&lt;/style&gt;
&lt;h3 id=&#34;image-attesting-to-horrors-of-slavery-reportedly-ordered-removed-by-trump-据报道特朗普下令移除一张证明奴役暴行的图片&#34;&gt;Image Attesting to Horrors of Slavery Reportedly Ordered Removed by Trump 据报道，特朗普下令移除一张证明奴役暴行的图片
&lt;/h3&gt;&lt;div class=&#34;note-card&#34;&gt;
    &lt;div class=&#34;nc-accent&#34;&gt;&lt;/div&gt;

    &lt;div class=&#34;nc-header&#34;&gt;
        &lt;div class=&#34;nc-meta&#34;&gt;
            &lt;span class=&#34;nc-badge&#34;&gt;READING&lt;/span&gt;
            &lt;span class=&#34;nc-date&#34;&gt;2025-09-26&lt;/span&gt;
        &lt;/div&gt; &lt;a href=&#34;https://hyperallergic.com/1042103/image-attesting-to-horrors-of-slavery-reportedly-ordered-removed-by-trump/&#34; target=&#34;_blank&#34; class=&#34;nc-title&#34; title=&#34;访问原文&#34;&gt;
            Image Attesting to Horrors of Slavery Reportedly Ordered Removed by Trump 据报道，特朗普下令移除一张证明奴役暴行的图片
            &lt;svg class=&#34;nc-link-icon&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
        &lt;/a&gt;
    &lt;/div&gt;

    
    &lt;div class=&#34;nc-context&#34;&gt;
        &lt;div class=&#34;nc-quote-icon&#34;&gt;“&lt;/div&gt;
        &lt;div class=&#34;nc-summary-text&#34;&gt;据报道，特朗普政府官员下令从一座内战时期的国家纪念碑中移除一张关于奴隶制恐怖的著名照片“受鞭打的背部”。这张照片揭示了奴隶制的残酷，曾是废奴主义的有力象征。此外，还有报道称，要求移除批评“南方失落原因”叙事的标牌，并修改提及奴隶制内容的展示。这些举动与特朗普政府之前旨在“恢复美国历史的真相与理智”的行政命令一致，该命令要求其管辖范围内的纪念碑避免不当批评过去，而侧重于成就与进步。内政部发言人称相关移除报道是“毫无根据的虚假说法”，并表示所有解说性标牌都在审查中。&lt;/div&gt;
    &lt;/div&gt;
    

    
    
    
&lt;/div&gt;

&lt;style&gt;
     
    .note-card {
         
        --nc-bg-card: #ffffff;
        --nc-border: rgba(0,0,0,0.04);
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.08);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.12);
        
        --nc-title: #2c3e50;
        --nc-title-hover: #3a7bd5;
        --nc-meta: #999999;
        
        --nc-bg-context: #f8f9fa;
        --nc-border-context: #e2e8f0;
        --nc-quote-icon: #e2e8f0;
        --nc-text-summary: #555555;
        
        --nc-label-bg: #ffffff;
        --nc-label-text: #2d3748;
        --nc-content-text: #2d3748;
        --nc-link-icon: #cbd5e0;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.1);
        --nc-badge-text: #3a7bd5;

        position: relative;
        background: var(--nc-bg-card);
        border-radius: 12px;
        box-shadow: var(--nc-shadow);
        margin: 2.5rem 0;
        overflow: hidden;
        border: 1px solid var(--nc-border);
        font-family: inherit; 
        transition: transform 0.3s ease, box-shadow 0.3s ease, background 0.3s, border-color 0.3s;
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .note-card {
            --nc-bg-card: #1e1e1e;
            --nc-border: #333333;
            --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
            --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
            
            --nc-title: #f0f0f0;
            --nc-meta: #999999;
            
            --nc-bg-context: #252525;
            --nc-border-context: #444444;
            --nc-quote-icon: #333333;
            --nc-text-summary: #aaaaaa;
            
            --nc-label-bg: #1e1e1e;
            --nc-label-text: #cccccc;
            --nc-content-text: #dddddd;
            --nc-link-icon: #666666;
            
            --nc-badge-bg: rgba(58, 123, 213, 0.2);
        }
    }

    html[data-scheme=&#34;dark&#34;] .note-card {
        --nc-bg-card: #1e1e1e;
        --nc-border: #333333;
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
        
        --nc-title: #f0f0f0;
        --nc-meta: #999999;
        
        --nc-bg-context: #252525;
        --nc-border-context: #444444;
        --nc-quote-icon: #333333;
        --nc-text-summary: #aaaaaa;
        
        --nc-label-bg: #1e1e1e;
        --nc-label-text: #cccccc;
        --nc-content-text: #dddddd;
        --nc-link-icon: #666666;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.2);
    }

    .note-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--nc-shadow-hover);
    }

     
    .nc-accent {
        height: 4px;
        background: linear-gradient(90deg, #3a7bd5, #00d2ff); 
        width: 100%;
    }

     
    .nc-header {
        padding: 24px 28px 10px; 
    }

    .nc-meta {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 10px; 
        font-size: 13px; 
        color: var(--nc-meta);
        font-weight: 600;
        letter-spacing: 1px;
        text-transform: uppercase;
    }

    .nc-badge {
        color: var(--nc-badge-text);
        background: var(--nc-badge-bg);
        padding: 2px 6px;
        border-radius: 4px;
    }

    .nc-title {
        display: block;
        font-size: 2rem; 
        font-weight: 700;
        color: var(--nc-title);
        text-decoration: none;
        line-height: 1.3;
        transition: color 0.2s;
    }

    .nc-title:hover {
        color: var(--nc-title-hover);
    }

    .nc-link-icon {
        width: 20px; 
        height: 20px;
        color: var(--nc-link-icon);
        margin-left: 5px;
        vertical-align: middle;
        transition: color 0.2s;
    }

    .nc-title:hover .nc-link-icon {
        color: var(--nc-title-hover);
    }

     
    .nc-context {
        margin: 12px 28px 24px;
        background: var(--nc-bg-context);
        padding: 20px 24px;
        border-radius: 8px;
        position: relative;
        border-left: 4px solid var(--nc-border-context);
        transition: background 0.3s, border-color 0.3s;
    }

    .nc-quote-icon {
        position: absolute;
        top: 8px;
        left: 10px;
        font-family: serif; 
        font-size: 40px;
        line-height: 1;
        color: var(--nc-quote-icon);
        pointer-events: none;
        transition: color 0.3s;
    }

    .nc-summary-text {
        font-size: 1.7rem; 
        color: var(--nc-text-summary);
        line-height: 1.6;
        font-style: italic;
        position: relative;
        z-index: 1;
        padding-left: 15px; 
        transition: color 0.3s;
    }

     
    .nc-body {
        padding: 0 28px 32px;
        position: relative;
    }

     
    .nc-label {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        font-size: 13px; 
        font-weight: 700;
        color: var(--nc-label-text);
        background: var(--nc-label-bg);
        padding-right: 10px;
        margin-bottom: 12px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
        transition: color 0.3s, background 0.3s;
    }

    .nc-content {
        color: var(--nc-content-text);
        font-size: 1.6rem; 
        line-height: 1.75;
        transition: color 0.3s;
    }

     
    .nc-content p { margin-bottom: 1em; }
    .nc-content p:last-child { margin-bottom: 0; }
    
    .nc-content ul { padding-left: 20px; color: inherit; }
    .nc-content li { margin-bottom: 6px; }
&lt;/style&gt;
&lt;h3 id=&#34;国家文物局答疑青海秦刻石认定过程北大教授李零介绍专家组识读情况&#34;&gt;国家文物局答疑青海秦刻石认定过程，北大教授李零介绍专家组识读情况
&lt;/h3&gt;&lt;div class=&#34;note-card&#34;&gt;
    &lt;div class=&#34;nc-accent&#34;&gt;&lt;/div&gt;

    &lt;div class=&#34;nc-header&#34;&gt;
        &lt;div class=&#34;nc-meta&#34;&gt;
            &lt;span class=&#34;nc-badge&#34;&gt;READING&lt;/span&gt;
            &lt;span class=&#34;nc-date&#34;&gt;2025-09-26&lt;/span&gt;
        &lt;/div&gt; &lt;a href=&#34;https://m.thepaper.cn/detail/31614808&#34; target=&#34;_blank&#34; class=&#34;nc-title&#34; title=&#34;访问原文&#34;&gt;
            国家文物局答疑青海秦刻石认定过程，北大教授李零介绍专家组识读情况
            &lt;svg class=&#34;nc-link-icon&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
        &lt;/a&gt;
    &lt;/div&gt;

    
    &lt;div class=&#34;nc-context&#34;&gt;
        &lt;div class=&#34;nc-quote-icon&#34;&gt;“&lt;/div&gt;
        &lt;div class=&#34;nc-summary-text&#34;&gt;国家文物局宣布青海玛多县尕日塘秦刻石为秦代遗存。此前，因相关报道引发学术界和公众疑问，国家文物局组织多学科专家两赴现场调查，获取科学数据，并召开论证会，最终形成一致意见。北京大学教授李零介绍了专家组识读情况，并表示支持调查报告结论。报告从文字识别、工艺、环境、岩性、风化等多个角度论证，排除现代伪造可能。刻石内容虽与文献记载有差异，但通过专家释读和科学分析，证明其为秦代刻石，具有重要历史价值，现已公布为县级文物保护单位。&lt;/div&gt;
    &lt;/div&gt;
    

    
    
    
&lt;/div&gt;

&lt;style&gt;
     
    .note-card {
         
        --nc-bg-card: #ffffff;
        --nc-border: rgba(0,0,0,0.04);
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.08);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.12);
        
        --nc-title: #2c3e50;
        --nc-title-hover: #3a7bd5;
        --nc-meta: #999999;
        
        --nc-bg-context: #f8f9fa;
        --nc-border-context: #e2e8f0;
        --nc-quote-icon: #e2e8f0;
        --nc-text-summary: #555555;
        
        --nc-label-bg: #ffffff;
        --nc-label-text: #2d3748;
        --nc-content-text: #2d3748;
        --nc-link-icon: #cbd5e0;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.1);
        --nc-badge-text: #3a7bd5;

        position: relative;
        background: var(--nc-bg-card);
        border-radius: 12px;
        box-shadow: var(--nc-shadow);
        margin: 2.5rem 0;
        overflow: hidden;
        border: 1px solid var(--nc-border);
        font-family: inherit; 
        transition: transform 0.3s ease, box-shadow 0.3s ease, background 0.3s, border-color 0.3s;
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .note-card {
            --nc-bg-card: #1e1e1e;
            --nc-border: #333333;
            --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
            --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
            
            --nc-title: #f0f0f0;
            --nc-meta: #999999;
            
            --nc-bg-context: #252525;
            --nc-border-context: #444444;
            --nc-quote-icon: #333333;
            --nc-text-summary: #aaaaaa;
            
            --nc-label-bg: #1e1e1e;
            --nc-label-text: #cccccc;
            --nc-content-text: #dddddd;
            --nc-link-icon: #666666;
            
            --nc-badge-bg: rgba(58, 123, 213, 0.2);
        }
    }

    html[data-scheme=&#34;dark&#34;] .note-card {
        --nc-bg-card: #1e1e1e;
        --nc-border: #333333;
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
        
        --nc-title: #f0f0f0;
        --nc-meta: #999999;
        
        --nc-bg-context: #252525;
        --nc-border-context: #444444;
        --nc-quote-icon: #333333;
        --nc-text-summary: #aaaaaa;
        
        --nc-label-bg: #1e1e1e;
        --nc-label-text: #cccccc;
        --nc-content-text: #dddddd;
        --nc-link-icon: #666666;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.2);
    }

    .note-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--nc-shadow-hover);
    }

     
    .nc-accent {
        height: 4px;
        background: linear-gradient(90deg, #3a7bd5, #00d2ff); 
        width: 100%;
    }

     
    .nc-header {
        padding: 24px 28px 10px; 
    }

    .nc-meta {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 10px; 
        font-size: 13px; 
        color: var(--nc-meta);
        font-weight: 600;
        letter-spacing: 1px;
        text-transform: uppercase;
    }

    .nc-badge {
        color: var(--nc-badge-text);
        background: var(--nc-badge-bg);
        padding: 2px 6px;
        border-radius: 4px;
    }

    .nc-title {
        display: block;
        font-size: 2rem; 
        font-weight: 700;
        color: var(--nc-title);
        text-decoration: none;
        line-height: 1.3;
        transition: color 0.2s;
    }

    .nc-title:hover {
        color: var(--nc-title-hover);
    }

    .nc-link-icon {
        width: 20px; 
        height: 20px;
        color: var(--nc-link-icon);
        margin-left: 5px;
        vertical-align: middle;
        transition: color 0.2s;
    }

    .nc-title:hover .nc-link-icon {
        color: var(--nc-title-hover);
    }

     
    .nc-context {
        margin: 12px 28px 24px;
        background: var(--nc-bg-context);
        padding: 20px 24px;
        border-radius: 8px;
        position: relative;
        border-left: 4px solid var(--nc-border-context);
        transition: background 0.3s, border-color 0.3s;
    }

    .nc-quote-icon {
        position: absolute;
        top: 8px;
        left: 10px;
        font-family: serif; 
        font-size: 40px;
        line-height: 1;
        color: var(--nc-quote-icon);
        pointer-events: none;
        transition: color 0.3s;
    }

    .nc-summary-text {
        font-size: 1.7rem; 
        color: var(--nc-text-summary);
        line-height: 1.6;
        font-style: italic;
        position: relative;
        z-index: 1;
        padding-left: 15px; 
        transition: color 0.3s;
    }

     
    .nc-body {
        padding: 0 28px 32px;
        position: relative;
    }

     
    .nc-label {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        font-size: 13px; 
        font-weight: 700;
        color: var(--nc-label-text);
        background: var(--nc-label-bg);
        padding-right: 10px;
        margin-bottom: 12px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
        transition: color 0.3s, background 0.3s;
    }

    .nc-content {
        color: var(--nc-content-text);
        font-size: 1.6rem; 
        line-height: 1.75;
        transition: color 0.3s;
    }

     
    .nc-content p { margin-bottom: 1em; }
    .nc-content p:last-child { margin-bottom: 0; }
    
    .nc-content ul { padding-left: 20px; color: inherit; }
    .nc-content li { margin-bottom: 6px; }
&lt;/style&gt;
&lt;h3 id=&#34;廖庭輝制度善意與市場疑慮的交會租賃條例修法解析&#34;&gt;廖庭輝／制度善意與市場疑慮的交會：《租賃條例》修法解析
&lt;/h3&gt;&lt;div class=&#34;note-card&#34;&gt;
    &lt;div class=&#34;nc-accent&#34;&gt;&lt;/div&gt;

    &lt;div class=&#34;nc-header&#34;&gt;
        &lt;div class=&#34;nc-meta&#34;&gt;
            &lt;span class=&#34;nc-badge&#34;&gt;READING&lt;/span&gt;
            &lt;span class=&#34;nc-date&#34;&gt;2025-09-26&lt;/span&gt;
        &lt;/div&gt; &lt;a href=&#34;https://www.twreporter.org/a/opinion-regulation-of-rental-housing-market&#34; target=&#34;_blank&#34; class=&#34;nc-title&#34; title=&#34;访问原文&#34;&gt;
            廖庭輝／制度善意與市場疑慮的交會：《租賃條例》修法解析
            &lt;svg class=&#34;nc-link-icon&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
        &lt;/a&gt;
    &lt;/div&gt;

    
    &lt;div class=&#34;nc-context&#34;&gt;
        &lt;div class=&#34;nc-quote-icon&#34;&gt;“&lt;/div&gt;
        &lt;div class=&#34;nc-summary-text&#34;&gt;台灣《租賃條例》修法草案旨在保障租客居住權益，如延長租期、限制租金漲幅，並強化房東催收租金的權力。此改革被視為首次全面觸及租賃雙方的制度性變革，對改善長期存在的租屋黑市至關重要。然而，在高房價和市場不透明的壓力下，其落實仍面臨挑戰。文章建議，租屋市場透明化是管理關鍵，需透過租屋登錄、降低合法成本、提高違法風險等措施，並強調政府跨部會合作的重要性。此外，租金指數的科學化及建立租客信用制度也被認為是降低市場衝擊、促成市場穩定與健全的配套方案。&lt;/div&gt;
    &lt;/div&gt;
    

    
    
    
&lt;/div&gt;

&lt;style&gt;
     
    .note-card {
         
        --nc-bg-card: #ffffff;
        --nc-border: rgba(0,0,0,0.04);
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.08);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.12);
        
        --nc-title: #2c3e50;
        --nc-title-hover: #3a7bd5;
        --nc-meta: #999999;
        
        --nc-bg-context: #f8f9fa;
        --nc-border-context: #e2e8f0;
        --nc-quote-icon: #e2e8f0;
        --nc-text-summary: #555555;
        
        --nc-label-bg: #ffffff;
        --nc-label-text: #2d3748;
        --nc-content-text: #2d3748;
        --nc-link-icon: #cbd5e0;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.1);
        --nc-badge-text: #3a7bd5;

        position: relative;
        background: var(--nc-bg-card);
        border-radius: 12px;
        box-shadow: var(--nc-shadow);
        margin: 2.5rem 0;
        overflow: hidden;
        border: 1px solid var(--nc-border);
        font-family: inherit; 
        transition: transform 0.3s ease, box-shadow 0.3s ease, background 0.3s, border-color 0.3s;
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .note-card {
            --nc-bg-card: #1e1e1e;
            --nc-border: #333333;
            --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
            --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
            
            --nc-title: #f0f0f0;
            --nc-meta: #999999;
            
            --nc-bg-context: #252525;
            --nc-border-context: #444444;
            --nc-quote-icon: #333333;
            --nc-text-summary: #aaaaaa;
            
            --nc-label-bg: #1e1e1e;
            --nc-label-text: #cccccc;
            --nc-content-text: #dddddd;
            --nc-link-icon: #666666;
            
            --nc-badge-bg: rgba(58, 123, 213, 0.2);
        }
    }

    html[data-scheme=&#34;dark&#34;] .note-card {
        --nc-bg-card: #1e1e1e;
        --nc-border: #333333;
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
        
        --nc-title: #f0f0f0;
        --nc-meta: #999999;
        
        --nc-bg-context: #252525;
        --nc-border-context: #444444;
        --nc-quote-icon: #333333;
        --nc-text-summary: #aaaaaa;
        
        --nc-label-bg: #1e1e1e;
        --nc-label-text: #cccccc;
        --nc-content-text: #dddddd;
        --nc-link-icon: #666666;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.2);
    }

    .note-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--nc-shadow-hover);
    }

     
    .nc-accent {
        height: 4px;
        background: linear-gradient(90deg, #3a7bd5, #00d2ff); 
        width: 100%;
    }

     
    .nc-header {
        padding: 24px 28px 10px; 
    }

    .nc-meta {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 10px; 
        font-size: 13px; 
        color: var(--nc-meta);
        font-weight: 600;
        letter-spacing: 1px;
        text-transform: uppercase;
    }

    .nc-badge {
        color: var(--nc-badge-text);
        background: var(--nc-badge-bg);
        padding: 2px 6px;
        border-radius: 4px;
    }

    .nc-title {
        display: block;
        font-size: 2rem; 
        font-weight: 700;
        color: var(--nc-title);
        text-decoration: none;
        line-height: 1.3;
        transition: color 0.2s;
    }

    .nc-title:hover {
        color: var(--nc-title-hover);
    }

    .nc-link-icon {
        width: 20px; 
        height: 20px;
        color: var(--nc-link-icon);
        margin-left: 5px;
        vertical-align: middle;
        transition: color 0.2s;
    }

    .nc-title:hover .nc-link-icon {
        color: var(--nc-title-hover);
    }

     
    .nc-context {
        margin: 12px 28px 24px;
        background: var(--nc-bg-context);
        padding: 20px 24px;
        border-radius: 8px;
        position: relative;
        border-left: 4px solid var(--nc-border-context);
        transition: background 0.3s, border-color 0.3s;
    }

    .nc-quote-icon {
        position: absolute;
        top: 8px;
        left: 10px;
        font-family: serif; 
        font-size: 40px;
        line-height: 1;
        color: var(--nc-quote-icon);
        pointer-events: none;
        transition: color 0.3s;
    }

    .nc-summary-text {
        font-size: 1.7rem; 
        color: var(--nc-text-summary);
        line-height: 1.6;
        font-style: italic;
        position: relative;
        z-index: 1;
        padding-left: 15px; 
        transition: color 0.3s;
    }

     
    .nc-body {
        padding: 0 28px 32px;
        position: relative;
    }

     
    .nc-label {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        font-size: 13px; 
        font-weight: 700;
        color: var(--nc-label-text);
        background: var(--nc-label-bg);
        padding-right: 10px;
        margin-bottom: 12px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
        transition: color 0.3s, background 0.3s;
    }

    .nc-content {
        color: var(--nc-content-text);
        font-size: 1.6rem; 
        line-height: 1.75;
        transition: color 0.3s;
    }

     
    .nc-content p { margin-bottom: 1em; }
    .nc-content p:last-child { margin-bottom: 0; }
    
    .nc-content ul { padding-left: 20px; color: inherit; }
    .nc-content li { margin-bottom: 6px; }
&lt;/style&gt;
&lt;h3 id=&#34;一场悄然发生的保守革命开除教授后美国大学的新政治生态&#34;&gt;一场悄然发生的保守革命：开除教授后，美国大学的新政治生态
&lt;/h3&gt;&lt;div class=&#34;note-card&#34;&gt;
    &lt;div class=&#34;nc-accent&#34;&gt;&lt;/div&gt;

    &lt;div class=&#34;nc-header&#34;&gt;
        &lt;div class=&#34;nc-meta&#34;&gt;
            &lt;span class=&#34;nc-badge&#34;&gt;READING&lt;/span&gt;
            &lt;span class=&#34;nc-date&#34;&gt;2025-09-26&lt;/span&gt;
        &lt;/div&gt; &lt;a href=&#34;https://m.thepaper.cn/detail/31627772&#34; target=&#34;_blank&#34; class=&#34;nc-title&#34; title=&#34;访问原文&#34;&gt;
            一场悄然发生的保守革命：开除教授后，美国大学的新政治生态
            &lt;svg class=&#34;nc-link-icon&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
        &lt;/a&gt;
    &lt;/div&gt;

    
    &lt;div class=&#34;nc-context&#34;&gt;
        &lt;div class=&#34;nc-quote-icon&#34;&gt;“&lt;/div&gt;
        &lt;div class=&#34;nc-summary-text&#34;&gt;美国大学出现“保守革命”，教师因言论遭解雇。德州农工大学教授梅丽莎·麦考尔因课堂讨论性别议题被开除，得州州立大学教授托马斯·埃特尔因质疑美国体制被解雇。保守派政客借机推动审查，导致多名教职人员被处分。文章认为，这是国家权力与民间政治动员结合的“保守革命”，旨在争夺高等教育系统的政治控制权。&lt;/div&gt;
    &lt;/div&gt;
    

    
    
    
&lt;/div&gt;

&lt;style&gt;
     
    .note-card {
         
        --nc-bg-card: #ffffff;
        --nc-border: rgba(0,0,0,0.04);
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.08);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.12);
        
        --nc-title: #2c3e50;
        --nc-title-hover: #3a7bd5;
        --nc-meta: #999999;
        
        --nc-bg-context: #f8f9fa;
        --nc-border-context: #e2e8f0;
        --nc-quote-icon: #e2e8f0;
        --nc-text-summary: #555555;
        
        --nc-label-bg: #ffffff;
        --nc-label-text: #2d3748;
        --nc-content-text: #2d3748;
        --nc-link-icon: #cbd5e0;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.1);
        --nc-badge-text: #3a7bd5;

        position: relative;
        background: var(--nc-bg-card);
        border-radius: 12px;
        box-shadow: var(--nc-shadow);
        margin: 2.5rem 0;
        overflow: hidden;
        border: 1px solid var(--nc-border);
        font-family: inherit; 
        transition: transform 0.3s ease, box-shadow 0.3s ease, background 0.3s, border-color 0.3s;
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .note-card {
            --nc-bg-card: #1e1e1e;
            --nc-border: #333333;
            --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
            --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
            
            --nc-title: #f0f0f0;
            --nc-meta: #999999;
            
            --nc-bg-context: #252525;
            --nc-border-context: #444444;
            --nc-quote-icon: #333333;
            --nc-text-summary: #aaaaaa;
            
            --nc-label-bg: #1e1e1e;
            --nc-label-text: #cccccc;
            --nc-content-text: #dddddd;
            --nc-link-icon: #666666;
            
            --nc-badge-bg: rgba(58, 123, 213, 0.2);
        }
    }

    html[data-scheme=&#34;dark&#34;] .note-card {
        --nc-bg-card: #1e1e1e;
        --nc-border: #333333;
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
        
        --nc-title: #f0f0f0;
        --nc-meta: #999999;
        
        --nc-bg-context: #252525;
        --nc-border-context: #444444;
        --nc-quote-icon: #333333;
        --nc-text-summary: #aaaaaa;
        
        --nc-label-bg: #1e1e1e;
        --nc-label-text: #cccccc;
        --nc-content-text: #dddddd;
        --nc-link-icon: #666666;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.2);
    }

    .note-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--nc-shadow-hover);
    }

     
    .nc-accent {
        height: 4px;
        background: linear-gradient(90deg, #3a7bd5, #00d2ff); 
        width: 100%;
    }

     
    .nc-header {
        padding: 24px 28px 10px; 
    }

    .nc-meta {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 10px; 
        font-size: 13px; 
        color: var(--nc-meta);
        font-weight: 600;
        letter-spacing: 1px;
        text-transform: uppercase;
    }

    .nc-badge {
        color: var(--nc-badge-text);
        background: var(--nc-badge-bg);
        padding: 2px 6px;
        border-radius: 4px;
    }

    .nc-title {
        display: block;
        font-size: 2rem; 
        font-weight: 700;
        color: var(--nc-title);
        text-decoration: none;
        line-height: 1.3;
        transition: color 0.2s;
    }

    .nc-title:hover {
        color: var(--nc-title-hover);
    }

    .nc-link-icon {
        width: 20px; 
        height: 20px;
        color: var(--nc-link-icon);
        margin-left: 5px;
        vertical-align: middle;
        transition: color 0.2s;
    }

    .nc-title:hover .nc-link-icon {
        color: var(--nc-title-hover);
    }

     
    .nc-context {
        margin: 12px 28px 24px;
        background: var(--nc-bg-context);
        padding: 20px 24px;
        border-radius: 8px;
        position: relative;
        border-left: 4px solid var(--nc-border-context);
        transition: background 0.3s, border-color 0.3s;
    }

    .nc-quote-icon {
        position: absolute;
        top: 8px;
        left: 10px;
        font-family: serif; 
        font-size: 40px;
        line-height: 1;
        color: var(--nc-quote-icon);
        pointer-events: none;
        transition: color 0.3s;
    }

    .nc-summary-text {
        font-size: 1.7rem; 
        color: var(--nc-text-summary);
        line-height: 1.6;
        font-style: italic;
        position: relative;
        z-index: 1;
        padding-left: 15px; 
        transition: color 0.3s;
    }

     
    .nc-body {
        padding: 0 28px 32px;
        position: relative;
    }

     
    .nc-label {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        font-size: 13px; 
        font-weight: 700;
        color: var(--nc-label-text);
        background: var(--nc-label-bg);
        padding-right: 10px;
        margin-bottom: 12px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
        transition: color 0.3s, background 0.3s;
    }

    .nc-content {
        color: var(--nc-content-text);
        font-size: 1.6rem; 
        line-height: 1.75;
        transition: color 0.3s;
    }

     
    .nc-content p { margin-bottom: 1em; }
    .nc-content p:last-child { margin-bottom: 0; }
    
    .nc-content ul { padding-left: 20px; color: inherit; }
    .nc-content li { margin-bottom: 6px; }
&lt;/style&gt;
&lt;h3 id=&#34;只有這堵牆不會背叛承諾關押30年未獲釋一名巴勒斯坦囚犯的獄中手記&#34;&gt;只有這堵牆不會背叛承諾──關押30年未獲釋，一名巴勒斯坦囚犯的獄中手記
&lt;/h3&gt;&lt;div class=&#34;note-card&#34;&gt;
    &lt;div class=&#34;nc-accent&#34;&gt;&lt;/div&gt;

    &lt;div class=&#34;nc-header&#34;&gt;
        &lt;div class=&#34;nc-meta&#34;&gt;
            &lt;span class=&#34;nc-badge&#34;&gt;READING&lt;/span&gt;
            &lt;span class=&#34;nc-date&#34;&gt;2025-09-26&lt;/span&gt;
        &lt;/div&gt; &lt;a href=&#34;https://www.twreporter.org/a/bookreview-the-tale-of-a-wall-reflections-on-the-meaning-of-hope-and-freedom&#34; target=&#34;_blank&#34; class=&#34;nc-title&#34; title=&#34;访问原文&#34;&gt;
            只有這堵牆不會背叛承諾──關押30年未獲釋，一名巴勒斯坦囚犯的獄中手記
            &lt;svg class=&#34;nc-link-icon&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
        &lt;/a&gt;
    &lt;/div&gt;

    
    &lt;div class=&#34;nc-context&#34;&gt;
        &lt;div class=&#34;nc-quote-icon&#34;&gt;“&lt;/div&gt;
        &lt;div class=&#34;nc-summary-text&#34;&gt;本書摘講述巴勒斯坦囚犯納瑟在以色列監獄中度過近30年的獄中手記。1993年，他被判處無期徒刑，卻在獄中目睹《奧斯陸協議》的承諾落空。他將牢獄的牆壁視為見證者與支撐，透過與牆對話，抒發對身分、民族、自由的思索。書中描繪了他在不同監獄的經歷，以及在兩極化的巴勒斯坦社會中，個人所感受到的文化衝突與身份認同的掙扎。儘管身陷囹圄，他仍以詩意的文字記錄對生命的感悟，將牆壁視為永不背叛的承諾。&lt;/div&gt;
    &lt;/div&gt;
    

    
    
    
&lt;/div&gt;

&lt;style&gt;
     
    .note-card {
         
        --nc-bg-card: #ffffff;
        --nc-border: rgba(0,0,0,0.04);
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.08);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.12);
        
        --nc-title: #2c3e50;
        --nc-title-hover: #3a7bd5;
        --nc-meta: #999999;
        
        --nc-bg-context: #f8f9fa;
        --nc-border-context: #e2e8f0;
        --nc-quote-icon: #e2e8f0;
        --nc-text-summary: #555555;
        
        --nc-label-bg: #ffffff;
        --nc-label-text: #2d3748;
        --nc-content-text: #2d3748;
        --nc-link-icon: #cbd5e0;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.1);
        --nc-badge-text: #3a7bd5;

        position: relative;
        background: var(--nc-bg-card);
        border-radius: 12px;
        box-shadow: var(--nc-shadow);
        margin: 2.5rem 0;
        overflow: hidden;
        border: 1px solid var(--nc-border);
        font-family: inherit; 
        transition: transform 0.3s ease, box-shadow 0.3s ease, background 0.3s, border-color 0.3s;
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .note-card {
            --nc-bg-card: #1e1e1e;
            --nc-border: #333333;
            --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
            --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
            
            --nc-title: #f0f0f0;
            --nc-meta: #999999;
            
            --nc-bg-context: #252525;
            --nc-border-context: #444444;
            --nc-quote-icon: #333333;
            --nc-text-summary: #aaaaaa;
            
            --nc-label-bg: #1e1e1e;
            --nc-label-text: #cccccc;
            --nc-content-text: #dddddd;
            --nc-link-icon: #666666;
            
            --nc-badge-bg: rgba(58, 123, 213, 0.2);
        }
    }

    html[data-scheme=&#34;dark&#34;] .note-card {
        --nc-bg-card: #1e1e1e;
        --nc-border: #333333;
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
        
        --nc-title: #f0f0f0;
        --nc-meta: #999999;
        
        --nc-bg-context: #252525;
        --nc-border-context: #444444;
        --nc-quote-icon: #333333;
        --nc-text-summary: #aaaaaa;
        
        --nc-label-bg: #1e1e1e;
        --nc-label-text: #cccccc;
        --nc-content-text: #dddddd;
        --nc-link-icon: #666666;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.2);
    }

    .note-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--nc-shadow-hover);
    }

     
    .nc-accent {
        height: 4px;
        background: linear-gradient(90deg, #3a7bd5, #00d2ff); 
        width: 100%;
    }

     
    .nc-header {
        padding: 24px 28px 10px; 
    }

    .nc-meta {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 10px; 
        font-size: 13px; 
        color: var(--nc-meta);
        font-weight: 600;
        letter-spacing: 1px;
        text-transform: uppercase;
    }

    .nc-badge {
        color: var(--nc-badge-text);
        background: var(--nc-badge-bg);
        padding: 2px 6px;
        border-radius: 4px;
    }

    .nc-title {
        display: block;
        font-size: 2rem; 
        font-weight: 700;
        color: var(--nc-title);
        text-decoration: none;
        line-height: 1.3;
        transition: color 0.2s;
    }

    .nc-title:hover {
        color: var(--nc-title-hover);
    }

    .nc-link-icon {
        width: 20px; 
        height: 20px;
        color: var(--nc-link-icon);
        margin-left: 5px;
        vertical-align: middle;
        transition: color 0.2s;
    }

    .nc-title:hover .nc-link-icon {
        color: var(--nc-title-hover);
    }

     
    .nc-context {
        margin: 12px 28px 24px;
        background: var(--nc-bg-context);
        padding: 20px 24px;
        border-radius: 8px;
        position: relative;
        border-left: 4px solid var(--nc-border-context);
        transition: background 0.3s, border-color 0.3s;
    }

    .nc-quote-icon {
        position: absolute;
        top: 8px;
        left: 10px;
        font-family: serif; 
        font-size: 40px;
        line-height: 1;
        color: var(--nc-quote-icon);
        pointer-events: none;
        transition: color 0.3s;
    }

    .nc-summary-text {
        font-size: 1.7rem; 
        color: var(--nc-text-summary);
        line-height: 1.6;
        font-style: italic;
        position: relative;
        z-index: 1;
        padding-left: 15px; 
        transition: color 0.3s;
    }

     
    .nc-body {
        padding: 0 28px 32px;
        position: relative;
    }

     
    .nc-label {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        font-size: 13px; 
        font-weight: 700;
        color: var(--nc-label-text);
        background: var(--nc-label-bg);
        padding-right: 10px;
        margin-bottom: 12px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
        transition: color 0.3s, background 0.3s;
    }

    .nc-content {
        color: var(--nc-content-text);
        font-size: 1.6rem; 
        line-height: 1.75;
        transition: color 0.3s;
    }

     
    .nc-content p { margin-bottom: 1em; }
    .nc-content p:last-child { margin-bottom: 0; }
    
    .nc-content ul { padding-left: 20px; color: inherit; }
    .nc-content li { margin-bottom: 6px; }
&lt;/style&gt;
&lt;h3 id=&#34;創作自由就是最大的民主走進首屆台灣國際攝影節思考影像如何被生產被看見被解讀&#34;&gt;創作自由就是最大的民主？走進首屆台灣國際攝影節，思考影像如何被生產、被看見、被解讀？
&lt;/h3&gt;&lt;div class=&#34;note-card&#34;&gt;
    &lt;div class=&#34;nc-accent&#34;&gt;&lt;/div&gt;

    &lt;div class=&#34;nc-header&#34;&gt;
        &lt;div class=&#34;nc-meta&#34;&gt;
            &lt;span class=&#34;nc-badge&#34;&gt;READING&lt;/span&gt;
            &lt;span class=&#34;nc-date&#34;&gt;2025-09-26&lt;/span&gt;
        &lt;/div&gt; &lt;a href=&#34;https://www.twreporter.org/a/bookreview-the-tale-of-a-wall-reflections-on-the-meaning-of-hope-and-freedom&#34; target=&#34;_blank&#34; class=&#34;nc-title&#34; title=&#34;访问原文&#34;&gt;
            創作自由就是最大的民主？走進首屆台灣國際攝影節，思考影像如何被生產、被看見、被解讀？
            &lt;svg class=&#34;nc-link-icon&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
        &lt;/a&gt;
    &lt;/div&gt;

    
    &lt;div class=&#34;nc-context&#34;&gt;
        &lt;div class=&#34;nc-quote-icon&#34;&gt;“&lt;/div&gt;
        &lt;div class=&#34;nc-summary-text&#34;&gt;首屆台灣國際攝影節（TIPF）以「民主的相機」為題，探討在人人都能拍照的時代，如何透過影像進行民主與專制的對話。展覽核心包括羅伯．法蘭克的經典作品，強調影像平權，以及台灣創作者與公民組織對民主的回應。活動旨在探討AI時代攝影師的角色、創作自由的本質、攝影美學的顛覆、年輕世代的台灣情感，以及建構台灣攝影文化。&lt;/div&gt;
    &lt;/div&gt;
    

    
    
    
&lt;/div&gt;

&lt;style&gt;
     
    .note-card {
         
        --nc-bg-card: #ffffff;
        --nc-border: rgba(0,0,0,0.04);
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.08);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.12);
        
        --nc-title: #2c3e50;
        --nc-title-hover: #3a7bd5;
        --nc-meta: #999999;
        
        --nc-bg-context: #f8f9fa;
        --nc-border-context: #e2e8f0;
        --nc-quote-icon: #e2e8f0;
        --nc-text-summary: #555555;
        
        --nc-label-bg: #ffffff;
        --nc-label-text: #2d3748;
        --nc-content-text: #2d3748;
        --nc-link-icon: #cbd5e0;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.1);
        --nc-badge-text: #3a7bd5;

        position: relative;
        background: var(--nc-bg-card);
        border-radius: 12px;
        box-shadow: var(--nc-shadow);
        margin: 2.5rem 0;
        overflow: hidden;
        border: 1px solid var(--nc-border);
        font-family: inherit; 
        transition: transform 0.3s ease, box-shadow 0.3s ease, background 0.3s, border-color 0.3s;
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .note-card {
            --nc-bg-card: #1e1e1e;
            --nc-border: #333333;
            --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
            --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
            
            --nc-title: #f0f0f0;
            --nc-meta: #999999;
            
            --nc-bg-context: #252525;
            --nc-border-context: #444444;
            --nc-quote-icon: #333333;
            --nc-text-summary: #aaaaaa;
            
            --nc-label-bg: #1e1e1e;
            --nc-label-text: #cccccc;
            --nc-content-text: #dddddd;
            --nc-link-icon: #666666;
            
            --nc-badge-bg: rgba(58, 123, 213, 0.2);
        }
    }

    html[data-scheme=&#34;dark&#34;] .note-card {
        --nc-bg-card: #1e1e1e;
        --nc-border: #333333;
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
        
        --nc-title: #f0f0f0;
        --nc-meta: #999999;
        
        --nc-bg-context: #252525;
        --nc-border-context: #444444;
        --nc-quote-icon: #333333;
        --nc-text-summary: #aaaaaa;
        
        --nc-label-bg: #1e1e1e;
        --nc-label-text: #cccccc;
        --nc-content-text: #dddddd;
        --nc-link-icon: #666666;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.2);
    }

    .note-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--nc-shadow-hover);
    }

     
    .nc-accent {
        height: 4px;
        background: linear-gradient(90deg, #3a7bd5, #00d2ff); 
        width: 100%;
    }

     
    .nc-header {
        padding: 24px 28px 10px; 
    }

    .nc-meta {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 10px; 
        font-size: 13px; 
        color: var(--nc-meta);
        font-weight: 600;
        letter-spacing: 1px;
        text-transform: uppercase;
    }

    .nc-badge {
        color: var(--nc-badge-text);
        background: var(--nc-badge-bg);
        padding: 2px 6px;
        border-radius: 4px;
    }

    .nc-title {
        display: block;
        font-size: 2rem; 
        font-weight: 700;
        color: var(--nc-title);
        text-decoration: none;
        line-height: 1.3;
        transition: color 0.2s;
    }

    .nc-title:hover {
        color: var(--nc-title-hover);
    }

    .nc-link-icon {
        width: 20px; 
        height: 20px;
        color: var(--nc-link-icon);
        margin-left: 5px;
        vertical-align: middle;
        transition: color 0.2s;
    }

    .nc-title:hover .nc-link-icon {
        color: var(--nc-title-hover);
    }

     
    .nc-context {
        margin: 12px 28px 24px;
        background: var(--nc-bg-context);
        padding: 20px 24px;
        border-radius: 8px;
        position: relative;
        border-left: 4px solid var(--nc-border-context);
        transition: background 0.3s, border-color 0.3s;
    }

    .nc-quote-icon {
        position: absolute;
        top: 8px;
        left: 10px;
        font-family: serif; 
        font-size: 40px;
        line-height: 1;
        color: var(--nc-quote-icon);
        pointer-events: none;
        transition: color 0.3s;
    }

    .nc-summary-text {
        font-size: 1.7rem; 
        color: var(--nc-text-summary);
        line-height: 1.6;
        font-style: italic;
        position: relative;
        z-index: 1;
        padding-left: 15px; 
        transition: color 0.3s;
    }

     
    .nc-body {
        padding: 0 28px 32px;
        position: relative;
    }

     
    .nc-label {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        font-size: 13px; 
        font-weight: 700;
        color: var(--nc-label-text);
        background: var(--nc-label-bg);
        padding-right: 10px;
        margin-bottom: 12px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
        transition: color 0.3s, background 0.3s;
    }

    .nc-content {
        color: var(--nc-content-text);
        font-size: 1.6rem; 
        line-height: 1.75;
        transition: color 0.3s;
    }

     
    .nc-content p { margin-bottom: 1em; }
    .nc-content p:last-child { margin-bottom: 0; }
    
    .nc-content ul { padding-left: 20px; color: inherit; }
    .nc-content li { margin-bottom: 6px; }
&lt;/style&gt;
&lt;h3 id=&#34;查理柯克之死政治极化下反对政治暴力的共识还能走多远&#34;&gt;查理·柯克之死：政治极化下，反对政治暴力的共识还能走多远
&lt;/h3&gt;&lt;div class=&#34;note-card&#34;&gt;
    &lt;div class=&#34;nc-accent&#34;&gt;&lt;/div&gt;

    &lt;div class=&#34;nc-header&#34;&gt;
        &lt;div class=&#34;nc-meta&#34;&gt;
            &lt;span class=&#34;nc-badge&#34;&gt;READING&lt;/span&gt;
            &lt;span class=&#34;nc-date&#34;&gt;2025-09-26&lt;/span&gt;
        &lt;/div&gt; &lt;a href=&#34;https://m.thepaper.cn/detail/31652020&#34; target=&#34;_blank&#34; class=&#34;nc-title&#34; title=&#34;访问原文&#34;&gt;
            查理·柯克之死：政治极化下，反对政治暴力的共识还能走多远
            &lt;svg class=&#34;nc-link-icon&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
        &lt;/a&gt;
    &lt;/div&gt;

    
    &lt;div class=&#34;nc-context&#34;&gt;
        &lt;div class=&#34;nc-quote-icon&#34;&gt;“&lt;/div&gt;
        &lt;div class=&#34;nc-summary-text&#34;&gt;美国政治极化加剧，反对政治暴力的共识面临严峻挑战。2012年，前国会议员吉福兹遇袭后重返国会递交辞呈，展现了跨党派温情。然而，十三年后，右翼活动人士查理·柯克遇刺身亡，加剧了对政治暴力侵蚀社会共识的担忧。柯克以其“美国转折点”组织，成功吸引年轻保守派。他一方面被视为反民主言论的代言人，另一方面其辩论和说服的方式又践行了民主原则。柯克遇刺后，尽管两党建制派呼吁和解，但极端派的言论和行为，以及民主党基层日益增长的不满，使得政治极化和对立进一步加剧，反对政治暴力的共识变得更加脆弱。&lt;/div&gt;
    &lt;/div&gt;
    

    
    
    
&lt;/div&gt;

&lt;style&gt;
     
    .note-card {
         
        --nc-bg-card: #ffffff;
        --nc-border: rgba(0,0,0,0.04);
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.08);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.12);
        
        --nc-title: #2c3e50;
        --nc-title-hover: #3a7bd5;
        --nc-meta: #999999;
        
        --nc-bg-context: #f8f9fa;
        --nc-border-context: #e2e8f0;
        --nc-quote-icon: #e2e8f0;
        --nc-text-summary: #555555;
        
        --nc-label-bg: #ffffff;
        --nc-label-text: #2d3748;
        --nc-content-text: #2d3748;
        --nc-link-icon: #cbd5e0;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.1);
        --nc-badge-text: #3a7bd5;

        position: relative;
        background: var(--nc-bg-card);
        border-radius: 12px;
        box-shadow: var(--nc-shadow);
        margin: 2.5rem 0;
        overflow: hidden;
        border: 1px solid var(--nc-border);
        font-family: inherit; 
        transition: transform 0.3s ease, box-shadow 0.3s ease, background 0.3s, border-color 0.3s;
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .note-card {
            --nc-bg-card: #1e1e1e;
            --nc-border: #333333;
            --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
            --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
            
            --nc-title: #f0f0f0;
            --nc-meta: #999999;
            
            --nc-bg-context: #252525;
            --nc-border-context: #444444;
            --nc-quote-icon: #333333;
            --nc-text-summary: #aaaaaa;
            
            --nc-label-bg: #1e1e1e;
            --nc-label-text: #cccccc;
            --nc-content-text: #dddddd;
            --nc-link-icon: #666666;
            
            --nc-badge-bg: rgba(58, 123, 213, 0.2);
        }
    }

    html[data-scheme=&#34;dark&#34;] .note-card {
        --nc-bg-card: #1e1e1e;
        --nc-border: #333333;
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
        
        --nc-title: #f0f0f0;
        --nc-meta: #999999;
        
        --nc-bg-context: #252525;
        --nc-border-context: #444444;
        --nc-quote-icon: #333333;
        --nc-text-summary: #aaaaaa;
        
        --nc-label-bg: #1e1e1e;
        --nc-label-text: #cccccc;
        --nc-content-text: #dddddd;
        --nc-link-icon: #666666;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.2);
    }

    .note-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--nc-shadow-hover);
    }

     
    .nc-accent {
        height: 4px;
        background: linear-gradient(90deg, #3a7bd5, #00d2ff); 
        width: 100%;
    }

     
    .nc-header {
        padding: 24px 28px 10px; 
    }

    .nc-meta {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 10px; 
        font-size: 13px; 
        color: var(--nc-meta);
        font-weight: 600;
        letter-spacing: 1px;
        text-transform: uppercase;
    }

    .nc-badge {
        color: var(--nc-badge-text);
        background: var(--nc-badge-bg);
        padding: 2px 6px;
        border-radius: 4px;
    }

    .nc-title {
        display: block;
        font-size: 2rem; 
        font-weight: 700;
        color: var(--nc-title);
        text-decoration: none;
        line-height: 1.3;
        transition: color 0.2s;
    }

    .nc-title:hover {
        color: var(--nc-title-hover);
    }

    .nc-link-icon {
        width: 20px; 
        height: 20px;
        color: var(--nc-link-icon);
        margin-left: 5px;
        vertical-align: middle;
        transition: color 0.2s;
    }

    .nc-title:hover .nc-link-icon {
        color: var(--nc-title-hover);
    }

     
    .nc-context {
        margin: 12px 28px 24px;
        background: var(--nc-bg-context);
        padding: 20px 24px;
        border-radius: 8px;
        position: relative;
        border-left: 4px solid var(--nc-border-context);
        transition: background 0.3s, border-color 0.3s;
    }

    .nc-quote-icon {
        position: absolute;
        top: 8px;
        left: 10px;
        font-family: serif; 
        font-size: 40px;
        line-height: 1;
        color: var(--nc-quote-icon);
        pointer-events: none;
        transition: color 0.3s;
    }

    .nc-summary-text {
        font-size: 1.7rem; 
        color: var(--nc-text-summary);
        line-height: 1.6;
        font-style: italic;
        position: relative;
        z-index: 1;
        padding-left: 15px; 
        transition: color 0.3s;
    }

     
    .nc-body {
        padding: 0 28px 32px;
        position: relative;
    }

     
    .nc-label {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        font-size: 13px; 
        font-weight: 700;
        color: var(--nc-label-text);
        background: var(--nc-label-bg);
        padding-right: 10px;
        margin-bottom: 12px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
        transition: color 0.3s, background 0.3s;
    }

    .nc-content {
        color: var(--nc-content-text);
        font-size: 1.6rem; 
        line-height: 1.75;
        transition: color 0.3s;
    }

     
    .nc-content p { margin-bottom: 1em; }
    .nc-content p:last-child { margin-bottom: 0; }
    
    .nc-content ul { padding-left: 20px; color: inherit; }
    .nc-content li { margin-bottom: 6px; }
&lt;/style&gt;
&lt;h3 id=&#34;凌旻华评午餐劳动美国校餐史预制菜与照护的危机&#34;&gt;凌旻华评《午餐劳动》｜美国校餐史：预制菜与照护的危机
&lt;/h3&gt;&lt;div class=&#34;note-card&#34;&gt;
    &lt;div class=&#34;nc-accent&#34;&gt;&lt;/div&gt;

    &lt;div class=&#34;nc-header&#34;&gt;
        &lt;div class=&#34;nc-meta&#34;&gt;
            &lt;span class=&#34;nc-badge&#34;&gt;READING&lt;/span&gt;
            &lt;span class=&#34;nc-date&#34;&gt;2025-09-26&lt;/span&gt;
        &lt;/div&gt; &lt;a href=&#34;https://m.thepaper.cn/detail/31655401&#34; target=&#34;_blank&#34; class=&#34;nc-title&#34; title=&#34;访问原文&#34;&gt;
            凌旻华评《午餐劳动》｜美国校餐史：预制菜与照护的危机
            &lt;svg class=&#34;nc-link-icon&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
        &lt;/a&gt;
    &lt;/div&gt;

    
    &lt;div class=&#34;nc-context&#34;&gt;
        &lt;div class=&#34;nc-quote-icon&#34;&gt;“&lt;/div&gt;
        &lt;div class=&#34;nc-summary-text&#34;&gt;《午餐劳动》一书回顾了美国校餐近百年的历史，揭示了预制菜如何通过成本考量和效率优先的逻辑渗透进校园。最初由进步女性发起的非营利校餐项目，在政府法案和食品工业化的双重影响下，逐渐走向商业化。预制菜虽然降低了成本，却带来了餐食质量下降、学生健康风险增加、食堂员工技能贬低以及照护劳动的价值被低估等隐性成本。文章认为，校餐不仅是营养供给，更是教育和文化实践，不应仅以安全和成本为唯一标准，而应关注其作为社会照护服务的本质。&lt;/div&gt;
    &lt;/div&gt;
    

    
    
    
&lt;/div&gt;

&lt;style&gt;
     
    .note-card {
         
        --nc-bg-card: #ffffff;
        --nc-border: rgba(0,0,0,0.04);
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.08);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.12);
        
        --nc-title: #2c3e50;
        --nc-title-hover: #3a7bd5;
        --nc-meta: #999999;
        
        --nc-bg-context: #f8f9fa;
        --nc-border-context: #e2e8f0;
        --nc-quote-icon: #e2e8f0;
        --nc-text-summary: #555555;
        
        --nc-label-bg: #ffffff;
        --nc-label-text: #2d3748;
        --nc-content-text: #2d3748;
        --nc-link-icon: #cbd5e0;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.1);
        --nc-badge-text: #3a7bd5;

        position: relative;
        background: var(--nc-bg-card);
        border-radius: 12px;
        box-shadow: var(--nc-shadow);
        margin: 2.5rem 0;
        overflow: hidden;
        border: 1px solid var(--nc-border);
        font-family: inherit; 
        transition: transform 0.3s ease, box-shadow 0.3s ease, background 0.3s, border-color 0.3s;
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .note-card {
            --nc-bg-card: #1e1e1e;
            --nc-border: #333333;
            --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
            --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
            
            --nc-title: #f0f0f0;
            --nc-meta: #999999;
            
            --nc-bg-context: #252525;
            --nc-border-context: #444444;
            --nc-quote-icon: #333333;
            --nc-text-summary: #aaaaaa;
            
            --nc-label-bg: #1e1e1e;
            --nc-label-text: #cccccc;
            --nc-content-text: #dddddd;
            --nc-link-icon: #666666;
            
            --nc-badge-bg: rgba(58, 123, 213, 0.2);
        }
    }

    html[data-scheme=&#34;dark&#34;] .note-card {
        --nc-bg-card: #1e1e1e;
        --nc-border: #333333;
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
        
        --nc-title: #f0f0f0;
        --nc-meta: #999999;
        
        --nc-bg-context: #252525;
        --nc-border-context: #444444;
        --nc-quote-icon: #333333;
        --nc-text-summary: #aaaaaa;
        
        --nc-label-bg: #1e1e1e;
        --nc-label-text: #cccccc;
        --nc-content-text: #dddddd;
        --nc-link-icon: #666666;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.2);
    }

    .note-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--nc-shadow-hover);
    }

     
    .nc-accent {
        height: 4px;
        background: linear-gradient(90deg, #3a7bd5, #00d2ff); 
        width: 100%;
    }

     
    .nc-header {
        padding: 24px 28px 10px; 
    }

    .nc-meta {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 10px; 
        font-size: 13px; 
        color: var(--nc-meta);
        font-weight: 600;
        letter-spacing: 1px;
        text-transform: uppercase;
    }

    .nc-badge {
        color: var(--nc-badge-text);
        background: var(--nc-badge-bg);
        padding: 2px 6px;
        border-radius: 4px;
    }

    .nc-title {
        display: block;
        font-size: 2rem; 
        font-weight: 700;
        color: var(--nc-title);
        text-decoration: none;
        line-height: 1.3;
        transition: color 0.2s;
    }

    .nc-title:hover {
        color: var(--nc-title-hover);
    }

    .nc-link-icon {
        width: 20px; 
        height: 20px;
        color: var(--nc-link-icon);
        margin-left: 5px;
        vertical-align: middle;
        transition: color 0.2s;
    }

    .nc-title:hover .nc-link-icon {
        color: var(--nc-title-hover);
    }

     
    .nc-context {
        margin: 12px 28px 24px;
        background: var(--nc-bg-context);
        padding: 20px 24px;
        border-radius: 8px;
        position: relative;
        border-left: 4px solid var(--nc-border-context);
        transition: background 0.3s, border-color 0.3s;
    }

    .nc-quote-icon {
        position: absolute;
        top: 8px;
        left: 10px;
        font-family: serif; 
        font-size: 40px;
        line-height: 1;
        color: var(--nc-quote-icon);
        pointer-events: none;
        transition: color 0.3s;
    }

    .nc-summary-text {
        font-size: 1.7rem; 
        color: var(--nc-text-summary);
        line-height: 1.6;
        font-style: italic;
        position: relative;
        z-index: 1;
        padding-left: 15px; 
        transition: color 0.3s;
    }

     
    .nc-body {
        padding: 0 28px 32px;
        position: relative;
    }

     
    .nc-label {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        font-size: 13px; 
        font-weight: 700;
        color: var(--nc-label-text);
        background: var(--nc-label-bg);
        padding-right: 10px;
        margin-bottom: 12px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
        transition: color 0.3s, background 0.3s;
    }

    .nc-content {
        color: var(--nc-content-text);
        font-size: 1.6rem; 
        line-height: 1.75;
        transition: color 0.3s;
    }

     
    .nc-content p { margin-bottom: 1em; }
    .nc-content p:last-child { margin-bottom: 0; }
    
    .nc-content ul { padding-left: 20px; color: inherit; }
    .nc-content li { margin-bottom: 6px; }
&lt;/style&gt;
&lt;h3 id=&#34;梁鹤年谈城市人与人本主义的探寻&#34;&gt;梁鹤年谈“城市人”与人本主义的探寻
&lt;/h3&gt;&lt;div class=&#34;note-card&#34;&gt;
    &lt;div class=&#34;nc-accent&#34;&gt;&lt;/div&gt;

    &lt;div class=&#34;nc-header&#34;&gt;
        &lt;div class=&#34;nc-meta&#34;&gt;
            &lt;span class=&#34;nc-badge&#34;&gt;READING&lt;/span&gt;
            &lt;span class=&#34;nc-date&#34;&gt;2025-09-26&lt;/span&gt;
        &lt;/div&gt; &lt;a href=&#34;https://m.thepaper.cn/detail/31624070&#34; target=&#34;_blank&#34; class=&#34;nc-title&#34; title=&#34;访问原文&#34;&gt;
            梁鹤年谈“城市人”与人本主义的探寻
            &lt;svg class=&#34;nc-link-icon&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
        &lt;/a&gt;
    &lt;/div&gt;

    
    &lt;div class=&#34;nc-context&#34;&gt;
        &lt;div class=&#34;nc-quote-icon&#34;&gt;“&lt;/div&gt;
        &lt;div class=&#34;nc-summary-text&#34;&gt;著名城市规划学者梁鹤年提出了原创的“城市人”理论，强调城市学应以人为本，并开发其基础理论。他认为“城市人”是追求空间接触机会而聚居在一起的人，其核心在于“自存与共存”的平衡，并提出“共存是自存的最佳保证，自存是共存的最佳标准”。这一理论深受道萨迪亚斯“空间接触机会”和亚里士多德“人是理性的动物”等思想启发。梁鹤年批判当前许多城市规划理论脱离空间，过于关注社会经济批判，而忽视了规划本质是空间优化。他强调规划师应立足空间，以人的物性（人的尺度）为基础，实现安全、舒适、美观、方便的空间。他认为AI发展有过度吹捧之嫌，可能导致世界变成规则世界而非人性世界，并对西方文明的物质主义和中国青年不尊师道表示担忧，但对中国传统文化的存在及其历史考验的价值充满信心。&lt;/div&gt;
    &lt;/div&gt;
    

    
    
    
&lt;/div&gt;

&lt;style&gt;
     
    .note-card {
         
        --nc-bg-card: #ffffff;
        --nc-border: rgba(0,0,0,0.04);
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.08);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.12);
        
        --nc-title: #2c3e50;
        --nc-title-hover: #3a7bd5;
        --nc-meta: #999999;
        
        --nc-bg-context: #f8f9fa;
        --nc-border-context: #e2e8f0;
        --nc-quote-icon: #e2e8f0;
        --nc-text-summary: #555555;
        
        --nc-label-bg: #ffffff;
        --nc-label-text: #2d3748;
        --nc-content-text: #2d3748;
        --nc-link-icon: #cbd5e0;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.1);
        --nc-badge-text: #3a7bd5;

        position: relative;
        background: var(--nc-bg-card);
        border-radius: 12px;
        box-shadow: var(--nc-shadow);
        margin: 2.5rem 0;
        overflow: hidden;
        border: 1px solid var(--nc-border);
        font-family: inherit; 
        transition: transform 0.3s ease, box-shadow 0.3s ease, background 0.3s, border-color 0.3s;
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .note-card {
            --nc-bg-card: #1e1e1e;
            --nc-border: #333333;
            --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
            --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
            
            --nc-title: #f0f0f0;
            --nc-meta: #999999;
            
            --nc-bg-context: #252525;
            --nc-border-context: #444444;
            --nc-quote-icon: #333333;
            --nc-text-summary: #aaaaaa;
            
            --nc-label-bg: #1e1e1e;
            --nc-label-text: #cccccc;
            --nc-content-text: #dddddd;
            --nc-link-icon: #666666;
            
            --nc-badge-bg: rgba(58, 123, 213, 0.2);
        }
    }

    html[data-scheme=&#34;dark&#34;] .note-card {
        --nc-bg-card: #1e1e1e;
        --nc-border: #333333;
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
        
        --nc-title: #f0f0f0;
        --nc-meta: #999999;
        
        --nc-bg-context: #252525;
        --nc-border-context: #444444;
        --nc-quote-icon: #333333;
        --nc-text-summary: #aaaaaa;
        
        --nc-label-bg: #1e1e1e;
        --nc-label-text: #cccccc;
        --nc-content-text: #dddddd;
        --nc-link-icon: #666666;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.2);
    }

    .note-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--nc-shadow-hover);
    }

     
    .nc-accent {
        height: 4px;
        background: linear-gradient(90deg, #3a7bd5, #00d2ff); 
        width: 100%;
    }

     
    .nc-header {
        padding: 24px 28px 10px; 
    }

    .nc-meta {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 10px; 
        font-size: 13px; 
        color: var(--nc-meta);
        font-weight: 600;
        letter-spacing: 1px;
        text-transform: uppercase;
    }

    .nc-badge {
        color: var(--nc-badge-text);
        background: var(--nc-badge-bg);
        padding: 2px 6px;
        border-radius: 4px;
    }

    .nc-title {
        display: block;
        font-size: 2rem; 
        font-weight: 700;
        color: var(--nc-title);
        text-decoration: none;
        line-height: 1.3;
        transition: color 0.2s;
    }

    .nc-title:hover {
        color: var(--nc-title-hover);
    }

    .nc-link-icon {
        width: 20px; 
        height: 20px;
        color: var(--nc-link-icon);
        margin-left: 5px;
        vertical-align: middle;
        transition: color 0.2s;
    }

    .nc-title:hover .nc-link-icon {
        color: var(--nc-title-hover);
    }

     
    .nc-context {
        margin: 12px 28px 24px;
        background: var(--nc-bg-context);
        padding: 20px 24px;
        border-radius: 8px;
        position: relative;
        border-left: 4px solid var(--nc-border-context);
        transition: background 0.3s, border-color 0.3s;
    }

    .nc-quote-icon {
        position: absolute;
        top: 8px;
        left: 10px;
        font-family: serif; 
        font-size: 40px;
        line-height: 1;
        color: var(--nc-quote-icon);
        pointer-events: none;
        transition: color 0.3s;
    }

    .nc-summary-text {
        font-size: 1.7rem; 
        color: var(--nc-text-summary);
        line-height: 1.6;
        font-style: italic;
        position: relative;
        z-index: 1;
        padding-left: 15px; 
        transition: color 0.3s;
    }

     
    .nc-body {
        padding: 0 28px 32px;
        position: relative;
    }

     
    .nc-label {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        font-size: 13px; 
        font-weight: 700;
        color: var(--nc-label-text);
        background: var(--nc-label-bg);
        padding-right: 10px;
        margin-bottom: 12px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
        transition: color 0.3s, background 0.3s;
    }

    .nc-content {
        color: var(--nc-content-text);
        font-size: 1.6rem; 
        line-height: 1.75;
        transition: color 0.3s;
    }

     
    .nc-content p { margin-bottom: 1em; }
    .nc-content p:last-child { margin-bottom: 0; }
    
    .nc-content ul { padding-left: 20px; color: inherit; }
    .nc-content li { margin-bottom: 6px; }
&lt;/style&gt;
&lt;h3 id=&#34;黃世澤相機可以民主嗎首屆台灣國際攝影節的影像權力思辨&#34;&gt;黃世澤／相機可以民主嗎？首屆台灣國際攝影節的影像權力思辨
&lt;/h3&gt;&lt;div class=&#34;note-card&#34;&gt;
    &lt;div class=&#34;nc-accent&#34;&gt;&lt;/div&gt;

    &lt;div class=&#34;nc-header&#34;&gt;
        &lt;div class=&#34;nc-meta&#34;&gt;
            &lt;span class=&#34;nc-badge&#34;&gt;READING&lt;/span&gt;
            &lt;span class=&#34;nc-date&#34;&gt;2025-09-26&lt;/span&gt;
        &lt;/div&gt; &lt;a href=&#34;https://www.twreporter.org/a/photo-tipf-2025-democratic-camera&#34; target=&#34;_blank&#34; class=&#34;nc-title&#34; title=&#34;访问原文&#34;&gt;
            黃世澤／相機可以民主嗎？首屆台灣國際攝影節的影像權力思辨
            &lt;svg class=&#34;nc-link-icon&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
        &lt;/a&gt;
    &lt;/div&gt;

    
    &lt;div class=&#34;nc-context&#34;&gt;
        &lt;div class=&#34;nc-quote-icon&#34;&gt;“&lt;/div&gt;
        &lt;div class=&#34;nc-summary-text&#34;&gt;首屆台灣國際攝影節以「民主的相機」為題，探討影像權力與民主的關係。展覽反思攝影如何從被視為單純文件資料，發展成藝術品，並探究其在大眾傳播中的民主潛力。展覽透過史泰德與法蘭克的攝影書與藝術民主化，以及台灣在地攝影師的創作實踐，展示了攝影的公共性、協作性及資訊判斷力。同時，探討數位時代AI生成影像的挑戰，強調實體展覽和攝影書在重塑觀看體驗中的價值。計畫也揭示了在專制體系影響下，實現「民主製造」的相機的艱難。攝影節的舉辦，旨在提供一個平台，促進攝影藝術與當代社會的對話，並強調民主與攝影一樣，需要持續練習、對話與重新定義。&lt;/div&gt;
    &lt;/div&gt;
    

    
    
    
&lt;/div&gt;

&lt;style&gt;
     
    .note-card {
         
        --nc-bg-card: #ffffff;
        --nc-border: rgba(0,0,0,0.04);
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.08);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.12);
        
        --nc-title: #2c3e50;
        --nc-title-hover: #3a7bd5;
        --nc-meta: #999999;
        
        --nc-bg-context: #f8f9fa;
        --nc-border-context: #e2e8f0;
        --nc-quote-icon: #e2e8f0;
        --nc-text-summary: #555555;
        
        --nc-label-bg: #ffffff;
        --nc-label-text: #2d3748;
        --nc-content-text: #2d3748;
        --nc-link-icon: #cbd5e0;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.1);
        --nc-badge-text: #3a7bd5;

        position: relative;
        background: var(--nc-bg-card);
        border-radius: 12px;
        box-shadow: var(--nc-shadow);
        margin: 2.5rem 0;
        overflow: hidden;
        border: 1px solid var(--nc-border);
        font-family: inherit; 
        transition: transform 0.3s ease, box-shadow 0.3s ease, background 0.3s, border-color 0.3s;
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .note-card {
            --nc-bg-card: #1e1e1e;
            --nc-border: #333333;
            --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
            --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
            
            --nc-title: #f0f0f0;
            --nc-meta: #999999;
            
            --nc-bg-context: #252525;
            --nc-border-context: #444444;
            --nc-quote-icon: #333333;
            --nc-text-summary: #aaaaaa;
            
            --nc-label-bg: #1e1e1e;
            --nc-label-text: #cccccc;
            --nc-content-text: #dddddd;
            --nc-link-icon: #666666;
            
            --nc-badge-bg: rgba(58, 123, 213, 0.2);
        }
    }

    html[data-scheme=&#34;dark&#34;] .note-card {
        --nc-bg-card: #1e1e1e;
        --nc-border: #333333;
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
        
        --nc-title: #f0f0f0;
        --nc-meta: #999999;
        
        --nc-bg-context: #252525;
        --nc-border-context: #444444;
        --nc-quote-icon: #333333;
        --nc-text-summary: #aaaaaa;
        
        --nc-label-bg: #1e1e1e;
        --nc-label-text: #cccccc;
        --nc-content-text: #dddddd;
        --nc-link-icon: #666666;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.2);
    }

    .note-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--nc-shadow-hover);
    }

     
    .nc-accent {
        height: 4px;
        background: linear-gradient(90deg, #3a7bd5, #00d2ff); 
        width: 100%;
    }

     
    .nc-header {
        padding: 24px 28px 10px; 
    }

    .nc-meta {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 10px; 
        font-size: 13px; 
        color: var(--nc-meta);
        font-weight: 600;
        letter-spacing: 1px;
        text-transform: uppercase;
    }

    .nc-badge {
        color: var(--nc-badge-text);
        background: var(--nc-badge-bg);
        padding: 2px 6px;
        border-radius: 4px;
    }

    .nc-title {
        display: block;
        font-size: 2rem; 
        font-weight: 700;
        color: var(--nc-title);
        text-decoration: none;
        line-height: 1.3;
        transition: color 0.2s;
    }

    .nc-title:hover {
        color: var(--nc-title-hover);
    }

    .nc-link-icon {
        width: 20px; 
        height: 20px;
        color: var(--nc-link-icon);
        margin-left: 5px;
        vertical-align: middle;
        transition: color 0.2s;
    }

    .nc-title:hover .nc-link-icon {
        color: var(--nc-title-hover);
    }

     
    .nc-context {
        margin: 12px 28px 24px;
        background: var(--nc-bg-context);
        padding: 20px 24px;
        border-radius: 8px;
        position: relative;
        border-left: 4px solid var(--nc-border-context);
        transition: background 0.3s, border-color 0.3s;
    }

    .nc-quote-icon {
        position: absolute;
        top: 8px;
        left: 10px;
        font-family: serif; 
        font-size: 40px;
        line-height: 1;
        color: var(--nc-quote-icon);
        pointer-events: none;
        transition: color 0.3s;
    }

    .nc-summary-text {
        font-size: 1.7rem; 
        color: var(--nc-text-summary);
        line-height: 1.6;
        font-style: italic;
        position: relative;
        z-index: 1;
        padding-left: 15px; 
        transition: color 0.3s;
    }

     
    .nc-body {
        padding: 0 28px 32px;
        position: relative;
    }

     
    .nc-label {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        font-size: 13px; 
        font-weight: 700;
        color: var(--nc-label-text);
        background: var(--nc-label-bg);
        padding-right: 10px;
        margin-bottom: 12px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
        transition: color 0.3s, background 0.3s;
    }

    .nc-content {
        color: var(--nc-content-text);
        font-size: 1.6rem; 
        line-height: 1.75;
        transition: color 0.3s;
    }

     
    .nc-content p { margin-bottom: 1em; }
    .nc-content p:last-child { margin-bottom: 0; }
    
    .nc-content ul { padding-left: 20px; color: inherit; }
    .nc-content li { margin-bottom: 6px; }
&lt;/style&gt;
&lt;h3 id=&#34;中国彩绘青铜已三千年最新研究实证多彩三星堆&#34;&gt;中国彩绘青铜已三千年！最新研究实证多彩三星堆
&lt;/h3&gt;&lt;div class=&#34;note-card&#34;&gt;
    &lt;div class=&#34;nc-accent&#34;&gt;&lt;/div&gt;

    &lt;div class=&#34;nc-header&#34;&gt;
        &lt;div class=&#34;nc-meta&#34;&gt;
            &lt;span class=&#34;nc-badge&#34;&gt;READING&lt;/span&gt;
            &lt;span class=&#34;nc-date&#34;&gt;2025-09-26&lt;/span&gt;
        &lt;/div&gt; &lt;a href=&#34;https://m.thepaper.cn/detail/31698023&#34; target=&#34;_blank&#34; class=&#34;nc-title&#34; title=&#34;访问原文&#34;&gt;
            中国彩绘青铜已三千年！最新研究实证多彩三星堆
            &lt;svg class=&#34;nc-link-icon&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
        &lt;/a&gt;
    &lt;/div&gt;

    
    &lt;div class=&#34;nc-context&#34;&gt;
        &lt;div class=&#34;nc-quote-icon&#34;&gt;“&lt;/div&gt;
        &lt;div class=&#34;nc-summary-text&#34;&gt;最新研究表明，三星堆出土大量彩绘青铜器，将中国彩绘青铜器历史提前近千年。这些约三千年前的青铜器，在金色基础上施以黑、红等斑斓色彩，用于描绘人物、神兽及器物纹饰，工艺精湛，取材天然。彩绘遍布上百件器物，显示出古蜀文明与中原文明在色彩运用上的共通之处，是中华文明多元一体的生动例证。&lt;/div&gt;
    &lt;/div&gt;
    

    
    
    
&lt;/div&gt;

&lt;style&gt;
     
    .note-card {
         
        --nc-bg-card: #ffffff;
        --nc-border: rgba(0,0,0,0.04);
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.08);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.12);
        
        --nc-title: #2c3e50;
        --nc-title-hover: #3a7bd5;
        --nc-meta: #999999;
        
        --nc-bg-context: #f8f9fa;
        --nc-border-context: #e2e8f0;
        --nc-quote-icon: #e2e8f0;
        --nc-text-summary: #555555;
        
        --nc-label-bg: #ffffff;
        --nc-label-text: #2d3748;
        --nc-content-text: #2d3748;
        --nc-link-icon: #cbd5e0;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.1);
        --nc-badge-text: #3a7bd5;

        position: relative;
        background: var(--nc-bg-card);
        border-radius: 12px;
        box-shadow: var(--nc-shadow);
        margin: 2.5rem 0;
        overflow: hidden;
        border: 1px solid var(--nc-border);
        font-family: inherit; 
        transition: transform 0.3s ease, box-shadow 0.3s ease, background 0.3s, border-color 0.3s;
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .note-card {
            --nc-bg-card: #1e1e1e;
            --nc-border: #333333;
            --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
            --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
            
            --nc-title: #f0f0f0;
            --nc-meta: #999999;
            
            --nc-bg-context: #252525;
            --nc-border-context: #444444;
            --nc-quote-icon: #333333;
            --nc-text-summary: #aaaaaa;
            
            --nc-label-bg: #1e1e1e;
            --nc-label-text: #cccccc;
            --nc-content-text: #dddddd;
            --nc-link-icon: #666666;
            
            --nc-badge-bg: rgba(58, 123, 213, 0.2);
        }
    }

    html[data-scheme=&#34;dark&#34;] .note-card {
        --nc-bg-card: #1e1e1e;
        --nc-border: #333333;
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
        
        --nc-title: #f0f0f0;
        --nc-meta: #999999;
        
        --nc-bg-context: #252525;
        --nc-border-context: #444444;
        --nc-quote-icon: #333333;
        --nc-text-summary: #aaaaaa;
        
        --nc-label-bg: #1e1e1e;
        --nc-label-text: #cccccc;
        --nc-content-text: #dddddd;
        --nc-link-icon: #666666;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.2);
    }

    .note-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--nc-shadow-hover);
    }

     
    .nc-accent {
        height: 4px;
        background: linear-gradient(90deg, #3a7bd5, #00d2ff); 
        width: 100%;
    }

     
    .nc-header {
        padding: 24px 28px 10px; 
    }

    .nc-meta {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 10px; 
        font-size: 13px; 
        color: var(--nc-meta);
        font-weight: 600;
        letter-spacing: 1px;
        text-transform: uppercase;
    }

    .nc-badge {
        color: var(--nc-badge-text);
        background: var(--nc-badge-bg);
        padding: 2px 6px;
        border-radius: 4px;
    }

    .nc-title {
        display: block;
        font-size: 2rem; 
        font-weight: 700;
        color: var(--nc-title);
        text-decoration: none;
        line-height: 1.3;
        transition: color 0.2s;
    }

    .nc-title:hover {
        color: var(--nc-title-hover);
    }

    .nc-link-icon {
        width: 20px; 
        height: 20px;
        color: var(--nc-link-icon);
        margin-left: 5px;
        vertical-align: middle;
        transition: color 0.2s;
    }

    .nc-title:hover .nc-link-icon {
        color: var(--nc-title-hover);
    }

     
    .nc-context {
        margin: 12px 28px 24px;
        background: var(--nc-bg-context);
        padding: 20px 24px;
        border-radius: 8px;
        position: relative;
        border-left: 4px solid var(--nc-border-context);
        transition: background 0.3s, border-color 0.3s;
    }

    .nc-quote-icon {
        position: absolute;
        top: 8px;
        left: 10px;
        font-family: serif; 
        font-size: 40px;
        line-height: 1;
        color: var(--nc-quote-icon);
        pointer-events: none;
        transition: color 0.3s;
    }

    .nc-summary-text {
        font-size: 1.7rem; 
        color: var(--nc-text-summary);
        line-height: 1.6;
        font-style: italic;
        position: relative;
        z-index: 1;
        padding-left: 15px; 
        transition: color 0.3s;
    }

     
    .nc-body {
        padding: 0 28px 32px;
        position: relative;
    }

     
    .nc-label {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        font-size: 13px; 
        font-weight: 700;
        color: var(--nc-label-text);
        background: var(--nc-label-bg);
        padding-right: 10px;
        margin-bottom: 12px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
        transition: color 0.3s, background 0.3s;
    }

    .nc-content {
        color: var(--nc-content-text);
        font-size: 1.6rem; 
        line-height: 1.75;
        transition: color 0.3s;
    }

     
    .nc-content p { margin-bottom: 1em; }
    .nc-content p:last-child { margin-bottom: 0; }
    
    .nc-content ul { padding-left: 20px; color: inherit; }
    .nc-content li { margin-bottom: 6px; }
&lt;/style&gt;
&lt;h3 id=&#34;故宫有多少家底单霁翔撰文回顾故宫博物院文物藏品清理&#34;&gt;故宫有多少家底？单霁翔撰文回顾故宫博物院文物藏品清理
&lt;/h3&gt;&lt;div class=&#34;note-card&#34;&gt;
    &lt;div class=&#34;nc-accent&#34;&gt;&lt;/div&gt;

    &lt;div class=&#34;nc-header&#34;&gt;
        &lt;div class=&#34;nc-meta&#34;&gt;
            &lt;span class=&#34;nc-badge&#34;&gt;READING&lt;/span&gt;
            &lt;span class=&#34;nc-date&#34;&gt;2025-09-26&lt;/span&gt;
        &lt;/div&gt; &lt;a href=&#34;https://m.thepaper.cn/detail/31697974&#34; target=&#34;_blank&#34; class=&#34;nc-title&#34; title=&#34;访问原文&#34;&gt;
            故宫有多少家底？单霁翔撰文回顾故宫博物院文物藏品清理
            &lt;svg class=&#34;nc-link-icon&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
        &lt;/a&gt;
    &lt;/div&gt;

    
    &lt;div class=&#34;nc-context&#34;&gt;
        &lt;div class=&#34;nc-quote-icon&#34;&gt;“&lt;/div&gt;
        &lt;div class=&#34;nc-summary-text&#34;&gt;故宫博物院进行了多次文物藏品清理，尤其是2004年至2010年的七年间，完成了大规模的普查和整理工作。此次清理核对了账、卡、物，并对“文物资料”进行了重新鉴定，纠正了部分文物等级评定不当的问题。截至2010年底，故宫博物院的文物藏品总数精确到1807558件（套），其中珍贵文物占比93.2%，占全国公共博物馆珍贵文物总量的41.98%。清理成果不仅摸清了家底，也为后续的数字化管理和出版《故宫博物院藏品大系》奠定了基础。&lt;/div&gt;
    &lt;/div&gt;
    

    
    
    
&lt;/div&gt;

&lt;style&gt;
     
    .note-card {
         
        --nc-bg-card: #ffffff;
        --nc-border: rgba(0,0,0,0.04);
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.08);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.12);
        
        --nc-title: #2c3e50;
        --nc-title-hover: #3a7bd5;
        --nc-meta: #999999;
        
        --nc-bg-context: #f8f9fa;
        --nc-border-context: #e2e8f0;
        --nc-quote-icon: #e2e8f0;
        --nc-text-summary: #555555;
        
        --nc-label-bg: #ffffff;
        --nc-label-text: #2d3748;
        --nc-content-text: #2d3748;
        --nc-link-icon: #cbd5e0;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.1);
        --nc-badge-text: #3a7bd5;

        position: relative;
        background: var(--nc-bg-card);
        border-radius: 12px;
        box-shadow: var(--nc-shadow);
        margin: 2.5rem 0;
        overflow: hidden;
        border: 1px solid var(--nc-border);
        font-family: inherit; 
        transition: transform 0.3s ease, box-shadow 0.3s ease, background 0.3s, border-color 0.3s;
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .note-card {
            --nc-bg-card: #1e1e1e;
            --nc-border: #333333;
            --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
            --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
            
            --nc-title: #f0f0f0;
            --nc-meta: #999999;
            
            --nc-bg-context: #252525;
            --nc-border-context: #444444;
            --nc-quote-icon: #333333;
            --nc-text-summary: #aaaaaa;
            
            --nc-label-bg: #1e1e1e;
            --nc-label-text: #cccccc;
            --nc-content-text: #dddddd;
            --nc-link-icon: #666666;
            
            --nc-badge-bg: rgba(58, 123, 213, 0.2);
        }
    }

    html[data-scheme=&#34;dark&#34;] .note-card {
        --nc-bg-card: #1e1e1e;
        --nc-border: #333333;
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
        
        --nc-title: #f0f0f0;
        --nc-meta: #999999;
        
        --nc-bg-context: #252525;
        --nc-border-context: #444444;
        --nc-quote-icon: #333333;
        --nc-text-summary: #aaaaaa;
        
        --nc-label-bg: #1e1e1e;
        --nc-label-text: #cccccc;
        --nc-content-text: #dddddd;
        --nc-link-icon: #666666;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.2);
    }

    .note-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--nc-shadow-hover);
    }

     
    .nc-accent {
        height: 4px;
        background: linear-gradient(90deg, #3a7bd5, #00d2ff); 
        width: 100%;
    }

     
    .nc-header {
        padding: 24px 28px 10px; 
    }

    .nc-meta {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 10px; 
        font-size: 13px; 
        color: var(--nc-meta);
        font-weight: 600;
        letter-spacing: 1px;
        text-transform: uppercase;
    }

    .nc-badge {
        color: var(--nc-badge-text);
        background: var(--nc-badge-bg);
        padding: 2px 6px;
        border-radius: 4px;
    }

    .nc-title {
        display: block;
        font-size: 2rem; 
        font-weight: 700;
        color: var(--nc-title);
        text-decoration: none;
        line-height: 1.3;
        transition: color 0.2s;
    }

    .nc-title:hover {
        color: var(--nc-title-hover);
    }

    .nc-link-icon {
        width: 20px; 
        height: 20px;
        color: var(--nc-link-icon);
        margin-left: 5px;
        vertical-align: middle;
        transition: color 0.2s;
    }

    .nc-title:hover .nc-link-icon {
        color: var(--nc-title-hover);
    }

     
    .nc-context {
        margin: 12px 28px 24px;
        background: var(--nc-bg-context);
        padding: 20px 24px;
        border-radius: 8px;
        position: relative;
        border-left: 4px solid var(--nc-border-context);
        transition: background 0.3s, border-color 0.3s;
    }

    .nc-quote-icon {
        position: absolute;
        top: 8px;
        left: 10px;
        font-family: serif; 
        font-size: 40px;
        line-height: 1;
        color: var(--nc-quote-icon);
        pointer-events: none;
        transition: color 0.3s;
    }

    .nc-summary-text {
        font-size: 1.7rem; 
        color: var(--nc-text-summary);
        line-height: 1.6;
        font-style: italic;
        position: relative;
        z-index: 1;
        padding-left: 15px; 
        transition: color 0.3s;
    }

     
    .nc-body {
        padding: 0 28px 32px;
        position: relative;
    }

     
    .nc-label {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        font-size: 13px; 
        font-weight: 700;
        color: var(--nc-label-text);
        background: var(--nc-label-bg);
        padding-right: 10px;
        margin-bottom: 12px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
        transition: color 0.3s, background 0.3s;
    }

    .nc-content {
        color: var(--nc-content-text);
        font-size: 1.6rem; 
        line-height: 1.75;
        transition: color 0.3s;
    }

     
    .nc-content p { margin-bottom: 1em; }
    .nc-content p:last-child { margin-bottom: 0; }
    
    .nc-content ul { padding-left: 20px; color: inherit; }
    .nc-content li { margin-bottom: 6px; }
&lt;/style&gt;
&lt;h3 id=&#34;michael-rakowitz-proxies-for-poets-and-palaces-at-stavanger-art-museum-迈克尔拉科维茨斯塔万格艺术博物馆的诗人和宫殿代理人&#34;&gt;Michael Rakowitz: Proxies for Poets and Palaces at Stavanger Art Museum 迈克尔·拉科维茨：斯塔万格艺术博物馆的诗人和宫殿代理人
&lt;/h3&gt;&lt;div class=&#34;note-card&#34;&gt;
    &lt;div class=&#34;nc-accent&#34;&gt;&lt;/div&gt;

    &lt;div class=&#34;nc-header&#34;&gt;
        &lt;div class=&#34;nc-meta&#34;&gt;
            &lt;span class=&#34;nc-badge&#34;&gt;READING&lt;/span&gt;
            &lt;span class=&#34;nc-date&#34;&gt;2025-09-26&lt;/span&gt;
        &lt;/div&gt; &lt;a href=&#34;https://kill-the-newsletter.com/feeds/ib1xav9ntb1widd1/entries/1khtr89530ve8va2fxuy.html&#34; target=&#34;_blank&#34; class=&#34;nc-title&#34; title=&#34;访问原文&#34;&gt;
            Michael Rakowitz: Proxies for Poets and Palaces at Stavanger Art Museum 迈克尔·拉科维茨：斯塔万格艺术博物馆的诗人和宫殿代理人
            &lt;svg class=&#34;nc-link-icon&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
        &lt;/a&gt;
    &lt;/div&gt;

    
    &lt;div class=&#34;nc-context&#34;&gt;
        &lt;div class=&#34;nc-quote-icon&#34;&gt;“&lt;/div&gt;
        &lt;div class=&#34;nc-summary-text&#34;&gt;伊拉克裔美国艺术家迈克尔·拉科维茨在斯塔万格艺术博物馆举办展览“诗人与宫殿的代理人”。展览重点展出他为该博物馆创作的八幅浮雕，这些浮雕是对亚述努塞拉宫殿失落雕塑的重建，使用回收材料象征性地“重现”被毁的文化遗产。展览还包括他关于阿富汗巴米扬大佛被毁事件的作品《将升起什么尘埃？》，以及探讨艺术与政治交织的电影作品《我擅长爱，我擅长恨，介于两者之间我冻结》，该作品受诗人伦纳德·科恩启发。拉科维茨的作品通过电影、雕塑和收藏品，敏感地审视历史事件，揭示帝国主义思维，并强调文化遗产在战争中的重要性。&lt;/div&gt;
    &lt;/div&gt;
    

    
    
    
&lt;/div&gt;

&lt;style&gt;
     
    .note-card {
         
        --nc-bg-card: #ffffff;
        --nc-border: rgba(0,0,0,0.04);
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.08);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.12);
        
        --nc-title: #2c3e50;
        --nc-title-hover: #3a7bd5;
        --nc-meta: #999999;
        
        --nc-bg-context: #f8f9fa;
        --nc-border-context: #e2e8f0;
        --nc-quote-icon: #e2e8f0;
        --nc-text-summary: #555555;
        
        --nc-label-bg: #ffffff;
        --nc-label-text: #2d3748;
        --nc-content-text: #2d3748;
        --nc-link-icon: #cbd5e0;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.1);
        --nc-badge-text: #3a7bd5;

        position: relative;
        background: var(--nc-bg-card);
        border-radius: 12px;
        box-shadow: var(--nc-shadow);
        margin: 2.5rem 0;
        overflow: hidden;
        border: 1px solid var(--nc-border);
        font-family: inherit; 
        transition: transform 0.3s ease, box-shadow 0.3s ease, background 0.3s, border-color 0.3s;
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .note-card {
            --nc-bg-card: #1e1e1e;
            --nc-border: #333333;
            --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
            --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
            
            --nc-title: #f0f0f0;
            --nc-meta: #999999;
            
            --nc-bg-context: #252525;
            --nc-border-context: #444444;
            --nc-quote-icon: #333333;
            --nc-text-summary: #aaaaaa;
            
            --nc-label-bg: #1e1e1e;
            --nc-label-text: #cccccc;
            --nc-content-text: #dddddd;
            --nc-link-icon: #666666;
            
            --nc-badge-bg: rgba(58, 123, 213, 0.2);
        }
    }

    html[data-scheme=&#34;dark&#34;] .note-card {
        --nc-bg-card: #1e1e1e;
        --nc-border: #333333;
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
        
        --nc-title: #f0f0f0;
        --nc-meta: #999999;
        
        --nc-bg-context: #252525;
        --nc-border-context: #444444;
        --nc-quote-icon: #333333;
        --nc-text-summary: #aaaaaa;
        
        --nc-label-bg: #1e1e1e;
        --nc-label-text: #cccccc;
        --nc-content-text: #dddddd;
        --nc-link-icon: #666666;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.2);
    }

    .note-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--nc-shadow-hover);
    }

     
    .nc-accent {
        height: 4px;
        background: linear-gradient(90deg, #3a7bd5, #00d2ff); 
        width: 100%;
    }

     
    .nc-header {
        padding: 24px 28px 10px; 
    }

    .nc-meta {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 10px; 
        font-size: 13px; 
        color: var(--nc-meta);
        font-weight: 600;
        letter-spacing: 1px;
        text-transform: uppercase;
    }

    .nc-badge {
        color: var(--nc-badge-text);
        background: var(--nc-badge-bg);
        padding: 2px 6px;
        border-radius: 4px;
    }

    .nc-title {
        display: block;
        font-size: 2rem; 
        font-weight: 700;
        color: var(--nc-title);
        text-decoration: none;
        line-height: 1.3;
        transition: color 0.2s;
    }

    .nc-title:hover {
        color: var(--nc-title-hover);
    }

    .nc-link-icon {
        width: 20px; 
        height: 20px;
        color: var(--nc-link-icon);
        margin-left: 5px;
        vertical-align: middle;
        transition: color 0.2s;
    }

    .nc-title:hover .nc-link-icon {
        color: var(--nc-title-hover);
    }

     
    .nc-context {
        margin: 12px 28px 24px;
        background: var(--nc-bg-context);
        padding: 20px 24px;
        border-radius: 8px;
        position: relative;
        border-left: 4px solid var(--nc-border-context);
        transition: background 0.3s, border-color 0.3s;
    }

    .nc-quote-icon {
        position: absolute;
        top: 8px;
        left: 10px;
        font-family: serif; 
        font-size: 40px;
        line-height: 1;
        color: var(--nc-quote-icon);
        pointer-events: none;
        transition: color 0.3s;
    }

    .nc-summary-text {
        font-size: 1.7rem; 
        color: var(--nc-text-summary);
        line-height: 1.6;
        font-style: italic;
        position: relative;
        z-index: 1;
        padding-left: 15px; 
        transition: color 0.3s;
    }

     
    .nc-body {
        padding: 0 28px 32px;
        position: relative;
    }

     
    .nc-label {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        font-size: 13px; 
        font-weight: 700;
        color: var(--nc-label-text);
        background: var(--nc-label-bg);
        padding-right: 10px;
        margin-bottom: 12px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
        transition: color 0.3s, background 0.3s;
    }

    .nc-content {
        color: var(--nc-content-text);
        font-size: 1.6rem; 
        line-height: 1.75;
        transition: color 0.3s;
    }

     
    .nc-content p { margin-bottom: 1em; }
    .nc-content p:last-child { margin-bottom: 0; }
    
    .nc-content ul { padding-left: 20px; color: inherit; }
    .nc-content li { margin-bottom: 6px; }
&lt;/style&gt;
&lt;h3 id=&#34;聚焦日本藏中国宋元绘画&#34;&gt;聚焦日本藏中国宋元绘画
&lt;/h3&gt;&lt;div class=&#34;note-card&#34;&gt;
    &lt;div class=&#34;nc-accent&#34;&gt;&lt;/div&gt;

    &lt;div class=&#34;nc-header&#34;&gt;
        &lt;div class=&#34;nc-meta&#34;&gt;
            &lt;span class=&#34;nc-badge&#34;&gt;READING&lt;/span&gt;
            &lt;span class=&#34;nc-date&#34;&gt;2025-09-26&lt;/span&gt;
        &lt;/div&gt; &lt;a href=&#34;https://m.thepaper.cn/detail/31695092&#34; target=&#34;_blank&#34; class=&#34;nc-title&#34; title=&#34;访问原文&#34;&gt;
            聚焦日本藏中国宋元绘画
            &lt;svg class=&#34;nc-link-icon&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
        &lt;/a&gt;
    &lt;/div&gt;

    
    &lt;div class=&#34;nc-context&#34;&gt;
        &lt;div class=&#34;nc-quote-icon&#34;&gt;“&lt;/div&gt;
        &lt;div class=&#34;nc-summary-text&#34;&gt;浙江大学近日举办“日本藏中国宋元绘画作品学术研讨会”，聚焦日本收藏的中国宋元绘画，探讨其学术价值，以推进宋元绘画史研究。日本收藏中国书画历史悠久，经历了“极古渡”、“古渡”、“中渡”、“新渡”四个阶段。此次研讨会包括多场学术报告、讨论及径山寺的座谈。会议旨在通过中日学者的交流互鉴，深化对宋元绘画的理解，促进艺术研究和文化交流。&lt;/div&gt;
    &lt;/div&gt;
    

    
    
    
&lt;/div&gt;

&lt;style&gt;
     
    .note-card {
         
        --nc-bg-card: #ffffff;
        --nc-border: rgba(0,0,0,0.04);
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.08);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.12);
        
        --nc-title: #2c3e50;
        --nc-title-hover: #3a7bd5;
        --nc-meta: #999999;
        
        --nc-bg-context: #f8f9fa;
        --nc-border-context: #e2e8f0;
        --nc-quote-icon: #e2e8f0;
        --nc-text-summary: #555555;
        
        --nc-label-bg: #ffffff;
        --nc-label-text: #2d3748;
        --nc-content-text: #2d3748;
        --nc-link-icon: #cbd5e0;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.1);
        --nc-badge-text: #3a7bd5;

        position: relative;
        background: var(--nc-bg-card);
        border-radius: 12px;
        box-shadow: var(--nc-shadow);
        margin: 2.5rem 0;
        overflow: hidden;
        border: 1px solid var(--nc-border);
        font-family: inherit; 
        transition: transform 0.3s ease, box-shadow 0.3s ease, background 0.3s, border-color 0.3s;
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .note-card {
            --nc-bg-card: #1e1e1e;
            --nc-border: #333333;
            --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
            --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
            
            --nc-title: #f0f0f0;
            --nc-meta: #999999;
            
            --nc-bg-context: #252525;
            --nc-border-context: #444444;
            --nc-quote-icon: #333333;
            --nc-text-summary: #aaaaaa;
            
            --nc-label-bg: #1e1e1e;
            --nc-label-text: #cccccc;
            --nc-content-text: #dddddd;
            --nc-link-icon: #666666;
            
            --nc-badge-bg: rgba(58, 123, 213, 0.2);
        }
    }

    html[data-scheme=&#34;dark&#34;] .note-card {
        --nc-bg-card: #1e1e1e;
        --nc-border: #333333;
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
        
        --nc-title: #f0f0f0;
        --nc-meta: #999999;
        
        --nc-bg-context: #252525;
        --nc-border-context: #444444;
        --nc-quote-icon: #333333;
        --nc-text-summary: #aaaaaa;
        
        --nc-label-bg: #1e1e1e;
        --nc-label-text: #cccccc;
        --nc-content-text: #dddddd;
        --nc-link-icon: #666666;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.2);
    }

    .note-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--nc-shadow-hover);
    }

     
    .nc-accent {
        height: 4px;
        background: linear-gradient(90deg, #3a7bd5, #00d2ff); 
        width: 100%;
    }

     
    .nc-header {
        padding: 24px 28px 10px; 
    }

    .nc-meta {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 10px; 
        font-size: 13px; 
        color: var(--nc-meta);
        font-weight: 600;
        letter-spacing: 1px;
        text-transform: uppercase;
    }

    .nc-badge {
        color: var(--nc-badge-text);
        background: var(--nc-badge-bg);
        padding: 2px 6px;
        border-radius: 4px;
    }

    .nc-title {
        display: block;
        font-size: 2rem; 
        font-weight: 700;
        color: var(--nc-title);
        text-decoration: none;
        line-height: 1.3;
        transition: color 0.2s;
    }

    .nc-title:hover {
        color: var(--nc-title-hover);
    }

    .nc-link-icon {
        width: 20px; 
        height: 20px;
        color: var(--nc-link-icon);
        margin-left: 5px;
        vertical-align: middle;
        transition: color 0.2s;
    }

    .nc-title:hover .nc-link-icon {
        color: var(--nc-title-hover);
    }

     
    .nc-context {
        margin: 12px 28px 24px;
        background: var(--nc-bg-context);
        padding: 20px 24px;
        border-radius: 8px;
        position: relative;
        border-left: 4px solid var(--nc-border-context);
        transition: background 0.3s, border-color 0.3s;
    }

    .nc-quote-icon {
        position: absolute;
        top: 8px;
        left: 10px;
        font-family: serif; 
        font-size: 40px;
        line-height: 1;
        color: var(--nc-quote-icon);
        pointer-events: none;
        transition: color 0.3s;
    }

    .nc-summary-text {
        font-size: 1.7rem; 
        color: var(--nc-text-summary);
        line-height: 1.6;
        font-style: italic;
        position: relative;
        z-index: 1;
        padding-left: 15px; 
        transition: color 0.3s;
    }

     
    .nc-body {
        padding: 0 28px 32px;
        position: relative;
    }

     
    .nc-label {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        font-size: 13px; 
        font-weight: 700;
        color: var(--nc-label-text);
        background: var(--nc-label-bg);
        padding-right: 10px;
        margin-bottom: 12px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
        transition: color 0.3s, background 0.3s;
    }

    .nc-content {
        color: var(--nc-content-text);
        font-size: 1.6rem; 
        line-height: 1.75;
        transition: color 0.3s;
    }

     
    .nc-content p { margin-bottom: 1em; }
    .nc-content p:last-child { margin-bottom: 0; }
    
    .nc-content ul { padding-left: 20px; color: inherit; }
    .nc-content li { margin-bottom: 6px; }
&lt;/style&gt;
&lt;h3 id=&#34;沈昭良廣場上的力量影像展威權地景上的民主吶喊衝撞體制的靈魂&#34;&gt;沈昭良／《廣場上的力量》影像展：威權地景上的民主吶喊，衝撞體制的靈魂
&lt;/h3&gt;&lt;div class=&#34;note-card&#34;&gt;
    &lt;div class=&#34;nc-accent&#34;&gt;&lt;/div&gt;

    &lt;div class=&#34;nc-header&#34;&gt;
        &lt;div class=&#34;nc-meta&#34;&gt;
            &lt;span class=&#34;nc-badge&#34;&gt;READING&lt;/span&gt;
            &lt;span class=&#34;nc-date&#34;&gt;2025-09-26&lt;/span&gt;
        &lt;/div&gt; &lt;a href=&#34;https://www.twreporter.org/a/photo-powers-of-square-cks-memorial-hall-social-movement-exhibition&#34; target=&#34;_blank&#34; class=&#34;nc-title&#34; title=&#34;访问原文&#34;&gt;
            沈昭良／《廣場上的力量》影像展：威權地景上的民主吶喊，衝撞體制的靈魂
            &lt;svg class=&#34;nc-link-icon&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
        &lt;/a&gt;
    &lt;/div&gt;

    
    &lt;div class=&#34;nc-context&#34;&gt;
        &lt;div class=&#34;nc-quote-icon&#34;&gt;“&lt;/div&gt;
        &lt;div class=&#34;nc-summary-text&#34;&gt;《廣場上的力量》影像展聚焦不同世代攝影師在社運現場拍攝的作品，展現民主抗爭的歷史。從古至今，廣場是公民集結、表達訴求、推動社會變革的象徵。展覽梳理了台灣解嚴後，特別是以中正紀念堂廣場為核心，歷經野百合學運、反軍人干政、反核、太陽花學運等數十場重要社會運動，透過影像記錄下人民爭取自由、公義的堅韌意志，以及攝影師對時代的回應。&lt;/div&gt;
    &lt;/div&gt;
    

    
    
    
&lt;/div&gt;

&lt;style&gt;
     
    .note-card {
         
        --nc-bg-card: #ffffff;
        --nc-border: rgba(0,0,0,0.04);
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.08);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.12);
        
        --nc-title: #2c3e50;
        --nc-title-hover: #3a7bd5;
        --nc-meta: #999999;
        
        --nc-bg-context: #f8f9fa;
        --nc-border-context: #e2e8f0;
        --nc-quote-icon: #e2e8f0;
        --nc-text-summary: #555555;
        
        --nc-label-bg: #ffffff;
        --nc-label-text: #2d3748;
        --nc-content-text: #2d3748;
        --nc-link-icon: #cbd5e0;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.1);
        --nc-badge-text: #3a7bd5;

        position: relative;
        background: var(--nc-bg-card);
        border-radius: 12px;
        box-shadow: var(--nc-shadow);
        margin: 2.5rem 0;
        overflow: hidden;
        border: 1px solid var(--nc-border);
        font-family: inherit; 
        transition: transform 0.3s ease, box-shadow 0.3s ease, background 0.3s, border-color 0.3s;
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .note-card {
            --nc-bg-card: #1e1e1e;
            --nc-border: #333333;
            --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
            --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
            
            --nc-title: #f0f0f0;
            --nc-meta: #999999;
            
            --nc-bg-context: #252525;
            --nc-border-context: #444444;
            --nc-quote-icon: #333333;
            --nc-text-summary: #aaaaaa;
            
            --nc-label-bg: #1e1e1e;
            --nc-label-text: #cccccc;
            --nc-content-text: #dddddd;
            --nc-link-icon: #666666;
            
            --nc-badge-bg: rgba(58, 123, 213, 0.2);
        }
    }

    html[data-scheme=&#34;dark&#34;] .note-card {
        --nc-bg-card: #1e1e1e;
        --nc-border: #333333;
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
        
        --nc-title: #f0f0f0;
        --nc-meta: #999999;
        
        --nc-bg-context: #252525;
        --nc-border-context: #444444;
        --nc-quote-icon: #333333;
        --nc-text-summary: #aaaaaa;
        
        --nc-label-bg: #1e1e1e;
        --nc-label-text: #cccccc;
        --nc-content-text: #dddddd;
        --nc-link-icon: #666666;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.2);
    }

    .note-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--nc-shadow-hover);
    }

     
    .nc-accent {
        height: 4px;
        background: linear-gradient(90deg, #3a7bd5, #00d2ff); 
        width: 100%;
    }

     
    .nc-header {
        padding: 24px 28px 10px; 
    }

    .nc-meta {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 10px; 
        font-size: 13px; 
        color: var(--nc-meta);
        font-weight: 600;
        letter-spacing: 1px;
        text-transform: uppercase;
    }

    .nc-badge {
        color: var(--nc-badge-text);
        background: var(--nc-badge-bg);
        padding: 2px 6px;
        border-radius: 4px;
    }

    .nc-title {
        display: block;
        font-size: 2rem; 
        font-weight: 700;
        color: var(--nc-title);
        text-decoration: none;
        line-height: 1.3;
        transition: color 0.2s;
    }

    .nc-title:hover {
        color: var(--nc-title-hover);
    }

    .nc-link-icon {
        width: 20px; 
        height: 20px;
        color: var(--nc-link-icon);
        margin-left: 5px;
        vertical-align: middle;
        transition: color 0.2s;
    }

    .nc-title:hover .nc-link-icon {
        color: var(--nc-title-hover);
    }

     
    .nc-context {
        margin: 12px 28px 24px;
        background: var(--nc-bg-context);
        padding: 20px 24px;
        border-radius: 8px;
        position: relative;
        border-left: 4px solid var(--nc-border-context);
        transition: background 0.3s, border-color 0.3s;
    }

    .nc-quote-icon {
        position: absolute;
        top: 8px;
        left: 10px;
        font-family: serif; 
        font-size: 40px;
        line-height: 1;
        color: var(--nc-quote-icon);
        pointer-events: none;
        transition: color 0.3s;
    }

    .nc-summary-text {
        font-size: 1.7rem; 
        color: var(--nc-text-summary);
        line-height: 1.6;
        font-style: italic;
        position: relative;
        z-index: 1;
        padding-left: 15px; 
        transition: color 0.3s;
    }

     
    .nc-body {
        padding: 0 28px 32px;
        position: relative;
    }

     
    .nc-label {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        font-size: 13px; 
        font-weight: 700;
        color: var(--nc-label-text);
        background: var(--nc-label-bg);
        padding-right: 10px;
        margin-bottom: 12px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
        transition: color 0.3s, background 0.3s;
    }

    .nc-content {
        color: var(--nc-content-text);
        font-size: 1.6rem; 
        line-height: 1.75;
        transition: color 0.3s;
    }

     
    .nc-content p { margin-bottom: 1em; }
    .nc-content p:last-child { margin-bottom: 0; }
    
    .nc-content ul { padding-left: 20px; color: inherit; }
    .nc-content li { margin-bottom: 6px; }
&lt;/style&gt;
&lt;h3 id=&#34;李开元谈历史时间与荆轲刺秦&#34;&gt;李开元谈历史时间与荆轲刺秦
&lt;/h3&gt;&lt;div class=&#34;note-card&#34;&gt;
    &lt;div class=&#34;nc-accent&#34;&gt;&lt;/div&gt;

    &lt;div class=&#34;nc-header&#34;&gt;
        &lt;div class=&#34;nc-meta&#34;&gt;
            &lt;span class=&#34;nc-badge&#34;&gt;READING&lt;/span&gt;
            &lt;span class=&#34;nc-date&#34;&gt;2025-09-26&lt;/span&gt;
        &lt;/div&gt; &lt;a href=&#34;https://m.thepaper.cn/detail/31673275&#34; target=&#34;_blank&#34; class=&#34;nc-title&#34; title=&#34;访问原文&#34;&gt;
            李开元谈历史时间与荆轲刺秦
            &lt;svg class=&#34;nc-link-icon&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;path d=&#34;M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6&#34;&gt;&lt;/path&gt;&lt;polyline points=&#34;15 3 21 3 21 9&#34;&gt;&lt;/polyline&gt;&lt;line x1=&#34;10&#34; y1=&#34;14&#34; x2=&#34;21&#34; y2=&#34;3&#34;&gt;&lt;/line&gt;&lt;/svg&gt;
        &lt;/a&gt;
    &lt;/div&gt;

    
    &lt;div class=&#34;nc-context&#34;&gt;
        &lt;div class=&#34;nc-quote-icon&#34;&gt;“&lt;/div&gt;
        &lt;div class=&#34;nc-summary-text&#34;&gt;史学家李开元新著《刺秦：重新认识秦王朝》深入探讨荆轲刺秦王事件，并提出夏无且可能是该故事的口述者。他通过重读《史记》及结合其他史料，分析了事件细节和人物动机。书中还重新审视了秦始皇的形象，认为其相貌性格被后世曲解，并探讨了秦汉之际史学叙事的变迁。李开元还提出了“历史时间”的新观，认为历史叙事应结合研究与文学性，以复原“活生生的历史”。&lt;/div&gt;
    &lt;/div&gt;
    

    
    
    
&lt;/div&gt;

&lt;style&gt;
     
    .note-card {
         
        --nc-bg-card: #ffffff;
        --nc-border: rgba(0,0,0,0.04);
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.08);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.12);
        
        --nc-title: #2c3e50;
        --nc-title-hover: #3a7bd5;
        --nc-meta: #999999;
        
        --nc-bg-context: #f8f9fa;
        --nc-border-context: #e2e8f0;
        --nc-quote-icon: #e2e8f0;
        --nc-text-summary: #555555;
        
        --nc-label-bg: #ffffff;
        --nc-label-text: #2d3748;
        --nc-content-text: #2d3748;
        --nc-link-icon: #cbd5e0;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.1);
        --nc-badge-text: #3a7bd5;

        position: relative;
        background: var(--nc-bg-card);
        border-radius: 12px;
        box-shadow: var(--nc-shadow);
        margin: 2.5rem 0;
        overflow: hidden;
        border: 1px solid var(--nc-border);
        font-family: inherit; 
        transition: transform 0.3s ease, box-shadow 0.3s ease, background 0.3s, border-color 0.3s;
    }

     
    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .note-card {
            --nc-bg-card: #1e1e1e;
            --nc-border: #333333;
            --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
            --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
            
            --nc-title: #f0f0f0;
            --nc-meta: #999999;
            
            --nc-bg-context: #252525;
            --nc-border-context: #444444;
            --nc-quote-icon: #333333;
            --nc-text-summary: #aaaaaa;
            
            --nc-label-bg: #1e1e1e;
            --nc-label-text: #cccccc;
            --nc-content-text: #dddddd;
            --nc-link-icon: #666666;
            
            --nc-badge-bg: rgba(58, 123, 213, 0.2);
        }
    }

    html[data-scheme=&#34;dark&#34;] .note-card {
        --nc-bg-card: #1e1e1e;
        --nc-border: #333333;
        --nc-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.3);
        --nc-shadow-hover: 0 15px 35px -10px rgba(0, 0, 0, 0.5);
        
        --nc-title: #f0f0f0;
        --nc-meta: #999999;
        
        --nc-bg-context: #252525;
        --nc-border-context: #444444;
        --nc-quote-icon: #333333;
        --nc-text-summary: #aaaaaa;
        
        --nc-label-bg: #1e1e1e;
        --nc-label-text: #cccccc;
        --nc-content-text: #dddddd;
        --nc-link-icon: #666666;
        
        --nc-badge-bg: rgba(58, 123, 213, 0.2);
    }

    .note-card:hover {
        transform: translateY(-3px);
        box-shadow: var(--nc-shadow-hover);
    }

     
    .nc-accent {
        height: 4px;
        background: linear-gradient(90deg, #3a7bd5, #00d2ff); 
        width: 100%;
    }

     
    .nc-header {
        padding: 24px 28px 10px; 
    }

    .nc-meta {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 10px; 
        font-size: 13px; 
        color: var(--nc-meta);
        font-weight: 600;
        letter-spacing: 1px;
        text-transform: uppercase;
    }

    .nc-badge {
        color: var(--nc-badge-text);
        background: var(--nc-badge-bg);
        padding: 2px 6px;
        border-radius: 4px;
    }

    .nc-title {
        display: block;
        font-size: 2rem; 
        font-weight: 700;
        color: var(--nc-title);
        text-decoration: none;
        line-height: 1.3;
        transition: color 0.2s;
    }

    .nc-title:hover {
        color: var(--nc-title-hover);
    }

    .nc-link-icon {
        width: 20px; 
        height: 20px;
        color: var(--nc-link-icon);
        margin-left: 5px;
        vertical-align: middle;
        transition: color 0.2s;
    }

    .nc-title:hover .nc-link-icon {
        color: var(--nc-title-hover);
    }

     
    .nc-context {
        margin: 12px 28px 24px;
        background: var(--nc-bg-context);
        padding: 20px 24px;
        border-radius: 8px;
        position: relative;
        border-left: 4px solid var(--nc-border-context);
        transition: background 0.3s, border-color 0.3s;
    }

    .nc-quote-icon {
        position: absolute;
        top: 8px;
        left: 10px;
        font-family: serif; 
        font-size: 40px;
        line-height: 1;
        color: var(--nc-quote-icon);
        pointer-events: none;
        transition: color 0.3s;
    }

    .nc-summary-text {
        font-size: 1.7rem; 
        color: var(--nc-text-summary);
        line-height: 1.6;
        font-style: italic;
        position: relative;
        z-index: 1;
        padding-left: 15px; 
        transition: color 0.3s;
    }

     
    .nc-body {
        padding: 0 28px 32px;
        position: relative;
    }

     
    .nc-label {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        font-size: 13px; 
        font-weight: 700;
        color: var(--nc-label-text);
        background: var(--nc-label-bg);
        padding-right: 10px;
        margin-bottom: 12px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
        transition: color 0.3s, background 0.3s;
    }

    .nc-content {
        color: var(--nc-content-text);
        font-size: 1.6rem; 
        line-height: 1.75;
        transition: color 0.3s;
    }

     
    .nc-content p { margin-bottom: 1em; }
    .nc-content p:last-child { margin-bottom: 0; }
    
    .nc-content ul { padding-left: 20px; color: inherit; }
    .nc-content li { margin-bottom: 6px; }
&lt;/style&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-62&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        今夏，秦汉史家李开元先后推出两本新著——《司马迁来到B大历史系》（生活·读书·新知三联书店2025年7月出版）与《刺秦：重新认识秦王朝》（上海人民出版社·世纪文景2025年8月出版，以下简称《刺秦》）。前者是李开元的随笔，有小说、诗歌、散文、剧本等不同类型的作品。后者系《秦谜：重新发现秦始皇》一书的姊妹篇，李开元继续深读《史记》，从历史记述之幽微处抽丝剥茧，重新发掘荆轲刺秦王这一经典故事，对其中秦汉史诸问题展开论述。特别的是，《司马迁来到B大历史系》中有两篇谈“历史时间”的文章，涉及对“历史是什么”的思考，而李开元在《刺秦》中由“如果荆轲杀了秦王”这一历史假设深入他的“侦探”之旅，那么，“如果荆轲杀了秦王”这一假设在李开元的“历史时间”之中吗？如何从历史假设推理出的叙述中重新认识秦王朝？这即是这篇专访的起点。
    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-62&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-63&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        &lt;p&gt;李开元：我们今天写作会明确地说是根据什么史料来写，把它交代得清清楚楚。司马迁作《史记》时并不是这样。他用了一些战国时期流传的材料，还有一些他听到的故事，他把这些笼统地合在一起，并没有告诉读者他具体是怎么做的。也正因为这样，给我们留下了一个待解的谜题，使我们能够重新侦查，有机会重新发现夏无且。&lt;/p&gt;
&lt;p&gt;在荆轲刺秦王的故事中，夏无且出现了两次——第一次是在荆轲刺秦的现场，他用药箱去打荆轲，没中；第二次是事后秦王特别表扬他，说要赏赐他。这个细节一直以来都不太被重视，实际上我也不是第一个注意到夏无且的人，顾颉刚先生就觉得这个人物很有意思，与荆轲刺秦的故事关系密切。《史记》中关于夏无且的第二处记载是在《刺客列传》的“太史公曰”中，司马迁在这里感慨说：世间流传一种谣言，说荆轲把秦王刺伤了，这是靠不住的。因为夏医生（即夏无且）在场，夏说没有刺伤，夏又把这个事情讲给公孙季公、董生听，他们两人又讲给我（司马谈，司马迁的父亲）听。所以，司马迁在这里把这个事情的前后讲了一遍。这就给我们留下了一个推想的空间。&lt;/p&gt;
&lt;p&gt;为什么以前很少有人关注这个问题，是因为我们往往觉得秦汉之间隔得很远，没有注意到夏医生是生活在秦汉两个时代的人。事实上秦始皇死了三年之后，秦朝就灭亡了，又过了五年汉朝就建立了。夏无且一直活到西汉初年，我们可以推想，他在西汉继续做医生的时候可能会讲这个故事，这样一来，荆轲刺秦这个故事的流传脉络就清楚了。&lt;/p&gt;
&lt;p&gt;荆轲刺秦王的故事之所以精彩，是因为里面有很多口语和动作的成分，精彩到让人觉得难以相信，日本学者宫崎市定先生根据故事中的口语和动作的记载认为，这更像一出戏剧。他觉得是司马迁去看戏，看戏的时候把它记了下来。这些在书中，我都有谈到。我只是进一步修正说，夏无且作为刺秦故事的在场者，他后来口述了这个故事，故事中的口语和动作，都是他在场的耳闻目见，所以形成了这么一个文本。&lt;/p&gt;

    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-63&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-64&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        李开元：如果没有这一段，可能就是一半成立。
如果仔细解读荆轲刺秦的文本，一方面，我们可以发现夏无且两次出现。另外，还可注意到文本中的讲述是基于医生的眼光。荆轲刺秦是如何刺的？故事说荆轲左手抓衣袖，右手持刀刺过去，没刺到，秦王拔出剑后，首先砍断了荆轲的左大腿，总共砍了八刀，这些都是医生的眼光。因为医生要验伤，他就记得很清楚，都是很独特的视角。如果我们以很专业的眼光来看的话，可以看出来夏无且在这个故事中非同寻常，但是无法证明刺秦的故事是基于夏的口述。
    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-64&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-65&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        秦始皇年轻时曾经受过很多委屈，但功成之后，没有无辜诛杀过任何一位功臣，这说明他性格比较沉稳宽容，并不因猜忌而乱杀人，他的相貌不应该是勾践这个类型。那更接近的是谁呢？我认为是东汉的光武帝，他不诛杀功臣，性格沉稳宽容。如果我们也从相面术的角度从性格推想相貌的话，秦始皇应当与光武帝属于同一龙相类型，“虎口日角，大目隆鼻”，也就是有力的大嘴，前额隆起，大眼睛高鼻梁。古代类书《太平御览》中有这样一条材料。当然，这也是基于相面术的推想，真相还埋藏在秦始皇陵下面，留待将来。
    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-65&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-66&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        &lt;p&gt;汉初，刘邦对秦始皇是非常尊重的。刘邦对以前的帝王，比如说各国的国王，包括信陵君都很尊重。他还曾拜祭秦始皇陵，为他设置的守墓专业户最多。为什么如此？因为最初刘邦他们觉得汉是继承了秦的，刘邦是以秦为根据地统一天下的。但文帝晚年的时候就出现了改制的动向，从贾谊开始。他们认为，我们不是秦的继承者，而是革命者，于是鼓吹改制的方士们制造了很多舆论，编造了很多故事，包括秦始皇的相貌。这点我还没有找到直接证据，但是觉得最可能是在这个时候。当然，文帝时并没有成功实现改制，到汉武帝时最终实现了改制。所以，方士在这方面的努力是经过一段时间完成的。&lt;/p&gt;
&lt;p&gt;另一方面是司马迁的态度。司马迁是秦国人，他祖上曾是秦国很重要的官吏，他对秦是有感情的，评价也比较客观。他对秦始皇有很多批评，认为统一天下是伟大的事业，而统一以后继续对外扩张，劳民伤财，这是秦亡很重要的原因。但是《汉书》的作者班固可不同。班固是楚国人。楚国被秦灭亡以后，把他们强制迁徙到了山西北部去，他对秦是有家仇国恨的，所以包括像秦始皇是吕不韦的私生子这样的说法，都是从班固开始的。&lt;/p&gt;
&lt;p&gt;我们今天看到的《史记》不是司马迁的原著，而是在流传过程中被掺入了很多东西之后的版本，而其中的“加工者”就有班家。因为《史记》比较特殊，长期以来是禁书，不许在外面流传，直到东汉末年以后，才开始公开。所以，在秦汉简大量出土的今天，我们从来没有出土过《史记》。&lt;/p&gt;

    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-66&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-67&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        &lt;p&gt;李开元：秦始皇从一开始就直接受到三种势力：一个是楚系，这是最强大的，从宣太后到华阳太后，一直到昌平君；另一个是韩系，来自他的亲祖母；还有一个即赵系，来自他的母亲，嫪毐就属于这一系。对于这三系势力，秦始皇最早清除的是韩系外戚，从打击异母弟成蟜入手，最大的功臣是嫪毐，背后的支持者是秦始皇的母亲赵姬，嫪毐由此就膨胀起来了。在秦始皇正式继位的时候，发生了嫪毐之乱，镇压嫪毐之乱后，赵系势力被清除。如此一来，楚系一家独大，等华阳太后去世以后，秦始皇就利用这个机会把楚系势力排除在外。&lt;/p&gt;
&lt;p&gt;在清除外戚势力的斗争中，秦始皇清除韩系外戚势力，借助赵系外戚势力，主要是借助母亲帝太后和嫪毐的力量。清除赵系外戚势力，借助楚系外戚势力，主要是养祖母华阳太后和昌平君的力量。华阳太后去世后，将昌平君免相，排斥所有的外戚和王族，重用如同蒙氏家族和李斯赵高这样的贤人，实现了国君个人专权。&lt;/p&gt;

    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-67&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;






&lt;div class=&#34;excerpt-card&#34; id=&#34;excerpt-68&#34; style=&#34;border-left-color: #366990;&#34;&gt;
    
    &lt;div class=&#34;ec-bg-icon&#34; style=&#34;color: #366990;&#34;&gt;“&lt;/div&gt;

    &lt;div class=&#34;ec-header&#34;&gt;
        &lt;div class=&#34;ec-tags&#34;&gt;
            
            &lt;span class=&#34;ec-tag&#34; style=&#34;background: #36699015; color: #366990;&#34;&gt;
                #摘录
            &lt;/span&gt;
            
        &lt;/div&gt;
        
        &lt;div class=&#34;ec-actions&#34;&gt;
            &lt;button class=&#34;ec-btn translate-btn&#34; aria-label=&#34;翻译内容&#34; title=&#34;点击翻译&#34; style=&#34;display:none;&#34;&gt;
                &lt;svg viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
                    &lt;path d=&#34;M5 8l6 6&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M4 14h6l2-2h8&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M2 5h12&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M7 2h1&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M22 22l-5-10-5 10&#34;&gt;&lt;/path&gt;
                    &lt;path d=&#34;M14 18h6&#34;&gt;&lt;/path&gt;
                &lt;/svg&gt;
            &lt;/button&gt;

            
            
            &lt;button class=&#34;ec-btn copy-btn&#34; aria-label=&#34;复制摘抄&#34; title=&#34;复制内容&#34;&gt;
                &lt;svg class=&#34;icon-copy&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;&gt;&lt;/rect&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
                &lt;svg class=&#34;icon-check&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;18&#34; height=&#34;18&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display:none;&#34;&gt;&lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&lt;/svg&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;ec-content&#34;&gt;
        &lt;p&gt;这五篇里就有谈历史时间的文章，一篇是《开源巴赫猜想：说历史学时间》，一篇是《千禧年在何年：说历史学时间的虚拟起点》。我觉得历史学的时间跟我们平时理解的时间不同。我们现在习惯以为时间是客观的，方向是过去—现在—未来。实际上并非如此，时间是一种人为设定的观念。历史学研究的是过去的事情，时间成了历史学的基本要素。不过，历史学者用了一种和一般人不一样的时间观：现在—过去方向的时间。就像考古的地层一样，我们站在现在的时间点去挖，先看到民国，然后是清代、明代……从现在到过去，倒序去挖去看。不过，从现在到过去进入历史后，必须确定一个观察点，然后再顺着从过去到现在的方向重新观察和书写历史。比如我们研究秦朝，首先从现在出发，倒过去进入两千年前的秦朝。进入秦朝后，选定某一起点（虚拟时间点），比如秦王政即位的前246年，然后从这个时间点，再顺序来观察和书写秦国的历史，从秦王政到秦始皇到秦二世——从过去到现在。&lt;/p&gt;
&lt;p&gt;所以说，历史学家所使用的时间观是很奇特的，是从现在回到过去以后，又从过去到现在重来。我们以前没有认识到这个问题。这种从现在到过去，又从过去到现在的认识方式，可能是历史学独有的？当然，这种探讨，一般人觉得太抽象不好理解，历史学家也多不关心，难得你关心到这个问题，我就多说两句。&lt;/p&gt;

    &lt;/div&gt;

    &lt;div class=&#34;ec-translation&#34; style=&#34;display: none;&#34;&gt;
        &lt;div class=&#34;ec-trans-loading&#34;&gt;正在翻译...&lt;/div&gt;
        &lt;div class=&#34;ec-trans-text&#34;&gt;&lt;/div&gt;
        &lt;div class=&#34;ec-trans-source&#34;&gt;&lt;/div&gt; 
    &lt;/div&gt;

    
&lt;/div&gt;

&lt;style&gt;
     
    .excerpt-card {
        --ec-bg-card: #fcfcfc;
        --ec-border: #e1e4e8;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.04);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.08);
        --ec-text-content: #1a1a1a;
        --ec-text-meta: #666666;
        --ec-line: #eaecef;
        --ec-btn-bg: rgba(0,0,0,0.03);
        --ec-btn-text: #999999;
        --ec-btn-hover-bg: rgba(0,0,0,0.08);
        --ec-btn-hover-text: #333333;
        --ec-bg-icon-opacity: 0.06;
        --ec-link-hover: #0366d6;
        
        position: relative;
        background: var(--ec-bg-card);
        border: 1px solid var(--ec-border);
        border-left-width: 6px;
        border-left-style: solid; 
        border-radius: 12px;
        margin: 3rem 0;
        padding: 24px 32px 30px;
        box-shadow: var(--ec-shadow);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.3s, border-color 0.3s;
        font-family: inherit;
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme=&#34;light&#34;]) .excerpt-card {
            --ec-bg-card: #1e1e1e;
            --ec-border: #333333;
            --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
            --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
            --ec-text-content: #f0f0f0;
            --ec-text-meta: #aaaaaa;
            --ec-line: #333333;
            --ec-btn-bg: rgba(255,255,255,0.05);
            --ec-btn-text: #777777;
            --ec-btn-hover-bg: rgba(255,255,255,0.15);
            --ec-btn-hover-text: #ffffff;
            --ec-bg-icon-opacity: 0.04;
        }
    }

    html[data-scheme=&#34;dark&#34;] .excerpt-card {
        --ec-bg-card: #1e1e1e;
        --ec-border: #333333;
        --ec-shadow: 0 8px 24px rgba(0,0,0,0.2);
        --ec-shadow-hover: 0 12px 35px rgba(0,0,0,0.4);
        --ec-text-content: #f0f0f0;
        --ec-text-meta: #aaaaaa;
        --ec-line: #333333;
        --ec-btn-bg: rgba(255,255,255,0.05);
        --ec-btn-text: #777777;
        --ec-btn-hover-bg: rgba(255,255,255,0.15);
        --ec-btn-hover-text: #ffffff;
        --ec-bg-icon-opacity: 0.04;
    }

    .excerpt-card:hover {
        transform: translateY(-2px);
        box-shadow: var(--ec-shadow-hover);
    }

    .ec-bg-icon {
        position: absolute;
        top: -25px;
        right: 20px;
        font-size: 120px;
        font-family: serif;
        opacity: var(--ec-bg-icon-opacity);
        pointer-events: none;
        line-height: 1;
        z-index: 0;
    }

    .ec-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        position: relative;
        z-index: 2;
        min-height: 28px;
    }

    .ec-tags { display: flex; gap: 8px; }
    .ec-tag {
        font-size: 12px;
        font-weight: 700;
        padding: 4px 10px;
        border-radius: 6px;
        text-transform: uppercase;
        letter-spacing: 0.5px;
    }

    .ec-actions { display: flex; gap: 8px; align-items: center; }

    .ec-btn {
        background: var(--ec-btn-bg);
        border: none;
        cursor: pointer;
        color: var(--ec-btn-text);
        width: 32px;
        height: 32px;
        border-radius: 8px;
        transition: all 0.2s;
        display: flex;
        align-items: center;
        justify-content: center;
        text-decoration: none; 
    }
    .ec-btn:hover {
        background: var(--ec-btn-hover-bg);
        color: var(--ec-btn-hover-text);
        transform: translateY(-1px);
    }
    .ec-btn.active {
        color: var(--ec-link-hover);
        background: rgba(3, 102, 214, 0.1);
    }
    .ec-btn.copy-btn.copied {
        color: #28a745 !important;
        background: rgba(40, 167, 69, 0.1);
    }

    .ec-content {
        position: relative;
        z-index: 1;
        font-family: inherit;
        font-size: 1.75rem; 
        line-height: 1.6;  
        color: var(--ec-text-content);
        font-style: normal;
        margin-bottom: 15px;
        font-weight: 500;
        transition: color 0.3s;
        text-align: justify;
        text-indent: 2em; 
    }
    .ec-content p { margin-bottom: 0; text-indent: 2em !important; }
    .ec-content.no-indent, .ec-content.no-indent p { text-indent: 0 !important; }
    .ec-content p + p { margin-top: 0.8em; }

    .ec-translation {
        margin-top: 15px;
        padding-top: 15px;
        border-top: 1px dashed var(--ec-line);
        font-size: 1.5rem; 
        line-height: 1.6;
        color: var(--ec-text-meta);
    }
    .ec-trans-loading {
        font-size: 0.9rem;
        color: #999;
        font-style: italic;
    }
    .ec-trans-source {
        font-size: 0.8rem;
        color: #ccc;
        margin-top: 8px;
        text-align: right;
    }

    .ec-footer { position: relative; z-index: 1; margin-top: 30px; }
    .ec-line { height: 1px; background: var(--ec-line); margin-bottom: 12px; width: 100%; transition: background 0.3s; }
    .ec-meta-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; font-size: 14px; color: var(--ec-text-meta); transition: color 0.3s; }
    .ec-info-left { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; }
    .ec-item { display: flex; align-items: center; gap: 6px; }
    .ec-icon-small { opacity: 0.7; }
    .ec-link-text { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; transition: all 0.2s; }
    .ec-link-text:hover { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: var(--hover-color, var(--ec-link-hover)); }
    .ec-link-text.linked { color: var(--hover-color, var(--ec-link-hover)); border-bottom-color: rgba(0,0,0,0.15); }

    @media (max-width: 600px) {
        .ec-content { font-size: 1.4rem; line-height: 1.6; }
        .excerpt-card { padding: 20px 24px; }
        .ec-meta-row { flex-direction: column; align-items: flex-start; gap: 8px; }
    }
&lt;/style&gt;

&lt;script&gt;
    (function() {
        const cardId = &#34;excerpt-68&#34;;
        const card = document.getElementById(cardId);
        if (!card) return;

        const content = card.querySelector(&#39;.ec-content&#39;);
        const translateBtn = card.querySelector(&#39;.translate-btn&#39;);
        const translationContainer = card.querySelector(&#39;.ec-translation&#39;);
        const transText = card.querySelector(&#39;.ec-trans-text&#39;);
        const transLoading = card.querySelector(&#39;.ec-trans-loading&#39;);
        const transSource = card.querySelector(&#39;.ec-trans-source&#39;);
        
        
        
        
        
        const fastProviders = [
            
            {
                name: &#34;Google&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://translate.googleapis.com/translate_a/single?client=gtx&amp;sl=${sl}&amp;tl=zh-CN&amp;dt=t&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x[0]).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Google(2)&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&amp;sl=${sl}&amp;tl=zh-CN&amp;q=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    if(!res.ok) throw new Error(&#34;Google2 Fail&#34;);
                    const data = await res.json();
                    return data[0].map(x =&gt; x).join(&#39;&#39;);
                }
            },
            
            {
                name: &#34;Microsoft&#34;,
                translate: async (text, lang) =&gt; {
                    
                    const authRes = await fetch(&#34;https://edge.microsoft.com/translate/auth&#34;);
                    if (!authRes.ok) throw new Error(&#34;MS Auth Fail&#34;);
                    const token = await authRes.text();
                    
                    const u = `https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&amp;to=zh-Hans&amp;textType=plain`;
                    const res = await fetch(u, {
                        method: &#34;POST&#34;,
                        headers: { &#34;Authorization&#34;: &#34;Bearer &#34; + token, &#34;Content-Type&#34;: &#34;application/json&#34; },
                        body: JSON.stringify([{Text: text}])
                    });
                    const data = await res.json();
                    return data[0].translations[0].text;
                }
            },
            
            {
                name: &#34;Lingva&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const res = await fetch(`https://lingva.ml/api/v1/${sl}/zh/${encodeURIComponent(text)}`);
                    const data = await res.json();
                    return data.translation;
                }
            },
            
            {
                name: &#34;Simply&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;auto&#39; : lang;
                    const u = `https://simplytranslate.org/api/translate/?engine=google&amp;from=${sl}&amp;to=zh-CN&amp;text=${encodeURIComponent(text)}`;
                    const res = await fetch(u);
                    const data = await res.json();
                    return data.translated_text;
                }
            }
        ];

        
        const backupProviders = [
            {
                name: &#34;Youdao (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fanyi.youdao.com/translate?&amp;doctype=json&amp;type=AUTO&amp;i=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.translateResult.map(p =&gt; p.map(s =&gt; s.tgt).join(&#34;&#34;)).join(&#34;\n&#34;);
                }
            },
            {
                name: &#34;Iciba (Proxy)&#34;,
                translate: async (text) =&gt; {
                    const u = `http://fy.iciba.com/ajax.php?a=fy&amp;f=auto&amp;t=zh&amp;w=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    return inner.content.out.replace(/&lt;br\/&gt;/g, &#34;\n&#34;);
                }
            },
            {
                name: &#34;LibreTranslate&#34;,
                translate: async (text) =&gt; {
                    const res = await fetch(&#34;https://de.libretranslate.com/translate&#34;, {
                        method: &#34;POST&#34;,
                        body: JSON.stringify({ q: text, source: &#34;auto&#34;, target: &#34;zh&#34;, format: &#34;text&#34; }),
                        headers: { &#34;Content-Type&#34;: &#34;application/json&#34; }
                    });
                    const data = await res.json();
                    return data.translatedText;
                }
            },
            {
                name: &#34;MyMemory&#34;,
                translate: async (text, lang) =&gt; {
                    const sl = lang === &#39;auto&#39; ? &#39;en&#39; : lang;
                    const res = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&amp;langpair=${sl}|zh-CN`);
                    const data = await res.json();
                    if(data.responseStatus === 200) return data.responseData.translatedText;
                    throw new Error(&#34;MyMemory Limit&#34;);
                }
            },
            {
                name: &#34;Baidu (Simple)&#34;,
                translate: async (text) =&gt; {
                    const u = `https://fanyi.baidu.com/sug?kw=${encodeURIComponent(text)}`;
                    const res = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(u)}`);
                    const data = await res.json();
                    const inner = JSON.parse(data.contents);
                    if(inner.data &amp;&amp; inner.data.length &gt; 0) return inner.data[0].v;
                    throw new Error(&#34;Baidu Fail&#34;);
                }
            }
        ];

        

        function detectSourceLang(str) {
            if (/[\u3040-\u30ff]/.test(str)) return &#39;ja&#39;;
            if (/[\uac00-\ud7af]/.test(str)) return &#39;ko&#39;;
            if (/[\u0400-\u04ff]/.test(str)) return &#39;ru&#39;;
            return &#39;auto&#39;; 
        }

        
        function raceProviders(providerList, text, lang) {
            return Promise.any(providerList.map(p =&gt; {
                
                return p.translate(text, lang)
                    .then(res =&gt; {
                        if(!res) throw new Error(&#34;Empty result&#34;);
                        return { text: res, provider: p.name };
                    });
            }));
        }

        
        async function fetchTranslationFast(fullText) {
            const CHUNK_SIZE = 450; 
            const chunks = [];
            let i = 0;
            while (i &lt; fullText.length) {
                let end = i + CHUNK_SIZE;
                if (end &gt;= fullText.length) {
                    chunks.push(fullText.slice(i));
                    break;
                }
                let lastSpace = fullText.lastIndexOf(&#39; &#39;, end);
                if (lastSpace &gt; i) {
                    chunks.push(fullText.slice(i, lastSpace));
                    i = lastSpace + 1;
                } else {
                    chunks.push(fullText.slice(i, end));
                    i = end;
                }
            }
            
            const lang = detectSourceLang(fullText);
            
            
            let finalResult = &#34;&#34;;
            let winningProvider = &#34;&#34;;

            for (const chunk of chunks) {
                let result = null;

                
                try {
                    const raceResult = await raceProviders(fastProviders, chunk, lang);
                    result = raceResult.text;
                    winningProvider = raceResult.provider;
                } catch (e) {
                    console.warn(&#34;第一梯队全军覆没，尝试备用线路...&#34;);
                }

                
                if (!result) {
                    for (const bp of backupProviders) {
                        try {
                            result = await bp.translate(chunk, lang);
                            winningProvider = bp.name;
                            break; 
                        } catch (e) {}
                    }
                }

                if (!result) throw new Error(&#34;所有接口均失败&#34;);
                finalResult += result + &#34; &#34;;
            }
            
            return { text: finalResult, provider: winningProvider };
        }


        
        if (content &amp;&amp; translateBtn) {
            const text = content.innerText.trim();
            const totalLength = text.length;
            const zhMatch = text.match(/[\u4e00-\u9fa5]/g);
            const zhLength = zhMatch ? zhMatch.length : 0;
            const nonZhRatio = totalLength &gt; 0 ? (1 - (zhLength / totalLength)) : 0;

            if (nonZhRatio &gt; 0.6) {
                translateBtn.style.display = &#39;flex&#39;;
                
                translateBtn.addEventListener(&#39;click&#39;, function(e) {
                    e.preventDefault();
                    
                    if (translationContainer.style.display === &#39;none&#39;) {
                        translationContainer.style.display = &#39;block&#39;;
                        translateBtn.classList.add(&#39;active&#39;);

                        if (transText.innerText.trim().length &gt; 0) return;

                        transLoading.style.display = &#39;block&#39;;
                        transLoading.innerText = &#34;🚀 正在全速翻译中...&#34;;
                        transSource.innerText = &#34;&#34;;
                        
                        fetchTranslationFast(text)
                            .then(result =&gt; {
                                transText.innerText = result.text;
                                transSource.innerText = `⚡ 翻译完成 via ${result.provider}`;
                                transLoading.style.display = &#39;none&#39;;
                            })
                            .catch(err =&gt; {
                                transLoading.innerText = &#34;翻译失败：网络可能存在严重阻断，所有接口均超时。&#34;;
                                console.error(err);
                            });

                    } else {
                        translationContainer.style.display = &#39;none&#39;;
                        translateBtn.classList.remove(&#39;active&#39;);
                    }
                });
            }
        }

        const copyBtn = card.querySelector(&#39;.copy-btn&#39;);
        if(copyBtn) {
            const iconCopy = copyBtn.querySelector(&#39;.icon-copy&#39;);
            const iconCheck = copyBtn.querySelector(&#39;.icon-check&#39;);
            const authorText = card.querySelector(&#39;.ec-info-left&#39;) ? card.querySelector(&#39;.ec-info-left&#39;).innerText.replace(/\s+/g, &#39; &#39;).trim() : &#34;&#34;;

            copyBtn.addEventListener(&#39;click&#39;, () =&gt; {
                let textToCopy = content.innerText.trim();
                if (authorText) {
                    textToCopy += `\n\n—— ${authorText}`;
                }
                navigator.clipboard.writeText(textToCopy).then(() =&gt; {
                    iconCopy.style.display = &#39;none&#39;;
                    iconCheck.style.display = &#39;block&#39;;
                    copyBtn.classList.add(&#39;copied&#39;);
                    setTimeout(() =&gt; {
                        iconCopy.style.display = &#39;block&#39;;
                        iconCheck.style.display = &#39;none&#39;;
                        copyBtn.classList.remove(&#39;copied&#39;);
                    }, 2000);
                }).catch(err =&gt; {
                    alert(&#34;复制失败，请手动复制&#34;);
                });
            });
        }
    })();
&lt;/script&gt;
&lt;h2 id=&#34;图像&#34;&gt;图像
&lt;/h2&gt;&lt;div class=&#34;hugo-gallery&#34; id=&#34;gallery-69&#34;&gt;
    &lt;div class=&#34;gallery-inline-layout&#34;&gt;
        
        &lt;div class=&#34;visual-column&#34;&gt;
            &lt;div class=&#34;gallery-viewport&#34;&gt;
                &lt;div class=&#34;gallery-track&#34;&gt;
                    
                        
                        
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20250926-image01.jpg&#34;
                                 data-src=&#34;20250926-image01.jpg&#34; 
                                 data-alt=&#34;最小花栗鼠，库特奈国家公园，蒙大拿州，美国&#34; 
                                 data-desc=&#34;在林地动物的世界里，体型最小的花栗鼠或许看起来像是“小松鼠”——但别小看它。凭借着敏锐的生存智慧和迅捷的双足，这种小型啮齿动物证明了“体型最小”并不意味着放弃你的潜力。它的体重还不到一副扑克牌，从鼻子到尾巴的长度不到10英寸（约25厘米），是北美体型最小的花栗鼠。   当它不是在爬木头或躲进落叶堆里时，它就在大快朵颐——真的。它那可扩张的颊囊帮助它将种子、浆果和昆虫拖到储藏点。到了冬天，它不会完全冬眠。相反，它会进入轻度麻木状态，偶尔醒来吃点零食。花栗鼠不喜群居，每只最小的花栗鼠每年夏天都会开辟自己的领地，通常会有一个隐蔽的洞穴和一个或十个备用的食物储藏室。但如果捕食者离得太近，你就会听到咔哒咔哒的警报声。   你知道吗？最小的花栗鼠记忆力超强，即使冬眠了很久，它也能记住数百个食物储藏点的位置。所以，下次你忘记停车的地方时，只要记住就行了——花栗鼠可不会忘记。&#34;
                                 data-link=&#34;https://cn.bing.com/search?q=%e6%9c%80%e5%b0%8f%e8%8a%b1%e6%a0%97%e9%bc%a0&amp;amp;form=hpcapt&amp;amp;filters=HpDate:%2220250925_1600%22&amp;#43;mgzv3configlist:%22BingQA_Encyclopedia_Layout%22&#34;&gt;
                                &lt;img src=&#34;20250926-image01.jpg&#34; alt=&#34;最小花栗鼠，库特奈国家公园，蒙大拿州，美国&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20250926-image02.jpg&#34;
                                 data-src=&#34;20250926-image02.jpg&#34; 
                                 data-alt=&#34;土星冲日&#34; 
                                 data-desc=&#34;今年的土星冲日发生在9月21日，在地球上看去，土星刚好在太阳的反方向。这时它距离地球最近，并且在太阳落下时升起，整晚都在暗淡的双鱼座天区中闪耀着。在这张来自青藏高原的青海冷湖天文观测研究基地的照片中，这颗外行星被一片微弱、弥散的椭圆形光晕包围，这片光晕就是对日照。对日照是由太阳系黄道面上的行星际尘埃散射太阳光而产生的，在地球的夜空中与太阳相对。在这个漆黑的夜晚，土星和对日照就像一只巨大的眼睛，似乎盯着这片彩色气辉下的天文台望远镜圆顶。&#34;
                                 data-link=&#34;https://www.bjp.org.cn/APOD/4028c136998394ad0199839f278a0006.shtml&#34;&gt;
                                &lt;img src=&#34;20250926-image02.jpg&#34; alt=&#34;土星冲日&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20250926-image03.jpg&#34;
                                 data-src=&#34;20250926-image03.jpg&#34; 
                                 data-alt=&#34;奇陶尔加尔堡，拉贾斯坦邦，印度&#34; 
                                 data-desc=&#34;奇陶尔加尔堡坐落在印度拉贾斯坦邦一座海拔超过590英尺的山丘上，占地约690英亩。它骄傲地见证着著名武士家族——拉杰普特人的英勇事迹。拉杰普特人的名字源自梵语“rajaputra”，意为“国王之子”，他们以其高贵的血统和尚武传统而闻名于整个印度北部。这座堡垒的石墙见证了几个世纪以来拉贾斯坦邦吟游诗人的歌谣中流传的勇气、骄傲和浪漫。据传说，印度史诗《摩诃婆罗多》中的英雄比姆是这座堡垒的奠基者。   奇陶尔加尔堡是印度最大的堡垒之一，拥有65座历史建筑，包括四座宫殿、19座大型寺庙、20座水库、四座纪念碑和几座胜利塔。这座堡垒周长约8.1英里，最长3.1英里。从平原出发，沿着一条陡峭的之字形山路蜿蜒而上，全长约半英里，从横跨甘比里河的石灰岩桥开始。沿着这条路攀登，穿过古老的城门，您仿佛能听到战争和传说的回响——仿佛在邀请您踏入一段鲜活的历史篇章。&#34;
                                 data-link=&#34;https://cn.bing.com/search?q=%e5%a5%87%e9%99%b6%e5%b0%94%e5%8a%a0%e5%b0%94%e5%a0%a1%e5%8d%b0%e5%ba%a6&amp;amp;form=hpcapt&amp;amp;filters=HpDate:%2220250924_1600%22&amp;#43;mgzv3configlist:%22BingQA_Encyclopedia_Layout%22&#34;&gt;
                                &lt;img src=&#34;20250926-image03.jpg&#34; alt=&#34;奇陶尔加尔堡，拉贾斯坦邦，印度&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20250926-image04.jpg&#34;
                                 data-src=&#34;20250926-image04.jpg&#34; 
                                 data-alt=&#34;魔鬼塔国家纪念碑，怀俄明州，美国&#34; 
                                 data-desc=&#34;在怀俄明州东北部辽阔的草原上，矗立着魔鬼塔——一座从开阔平原拔地而起的岩石地貌。这座山丘原名熊屋，在1875年理查德·欧文·道奇上校率领的探险队中获得现名，据推测可能源于一名翻译将原住民的表述误译为“恶神之塔”。其官方名称省略的撇号符合标准地理命名惯例——因此路标均标注为“魔鬼塔”。1906年，西奥多·罗斯福总统将其指定为美国首个国家纪念碑，这一里程碑事件的周年纪念日正值今日。   当你驶向魔鬼塔时，每道弯道都揭开新的景致——无论你从高速公路而来，沿着蜿蜒小路驶向游客中心，还是徒步踏上塔径。这片土地的意义远不止于其壮丽的地质景观。数百年间，来自大平原与黑丘地区的众多部落——包括阿拉帕霍族、乌鸦族和夏延族——都与这片土地有着深厚渊源。每个部落都传承着关于魔鬼塔起源的口述传说。尽管诸多传说存在共通主题，但细节却在每个族群中独具特色。魔鬼塔始终承载着地质演变、文化传承以及人类与自然世界间永恒变迁关系的鲜活史诗。&#34;
                                 data-link=&#34;https://cn.bing.com/search?q=%e9%ad%94%e9%ac%bc%e5%a1%94%e5%9b%bd%e5%ae%b6%e7%ba%aa%e5%bf%b5%e7%a2%91&amp;amp;form=hpcapt&amp;amp;filters=HpDate:%2220250923_1600%22&amp;#43;mgzv3configlist:%22BingQA_Encyclopedia_Layout%22&#34;&gt;
                                &lt;img src=&#34;20250926-image04.jpg&#34; alt=&#34;魔鬼塔国家纪念碑，怀俄明州，美国&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20250926-image05.jpg&#34;
                                 data-src=&#34;20250926-image05.jpg&#34; 
                                 data-alt=&#34;土星的春分&#34; 
                                 data-desc=&#34;在土星上，光环能显示季节。在地球上，今天是秋分——此时地球赤道正对着太阳。由于土星那宏伟的光环围绕着它的赤道，因此当土星自转轴的倾斜方向朝着太阳时，光环从太阳方向看去最为显眼。相反，当土星自转轴转向一侧，倾斜方向与太阳方向成90度时，就是春分或秋分，不仅从太阳方向难以看见光环，从地球上也同样难以观测。在这幅图中，集中呈现了 2020 年至 2025 年间的土星影像，展示了这颗巨行星如何在今年的分点时刻，从北半球的夏季过渡到南半球的夏季。巧合的是，就在21日，土星也刚好运行到最接近地球的位置。因此，这个月的土星格外明亮，整夜都能清晰可见。&#34;
                                 data-link=&#34;https://www.bjp.org.cn/APOD/4028c136997829c80199795744270002.shtml2&#34;&gt;
                                &lt;img src=&#34;20250926-image05.jpg&#34; alt=&#34;土星的春分&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20250926-image06.jpg&#34;
                                 data-src=&#34;20250926-image06.jpg&#34; 
                                 data-alt=&#34;秋日的白杨树，鱼湖国家森林，犹他州，美国&#34; 
                                 data-desc=&#34;随着九月的到来，今天图片中看到的白杨树开始了一年一度的变迁，呈现出鲜艳的黄色，在山丘上荡漾开来。这片森林覆盖了超过2300平方英里的湖泊、小径和山脉，秋天的色彩闪耀着光芒。看着季节与有着比我们遵循的公历更古老的事物同步变化，让人感到一种踏实的感觉。&#34;
                                 data-link=&#34;https://cn.bing.com/search?q=%e7%99%bd%e6%9d%a8%e6%a0%91&amp;amp;form=hpcapt&amp;amp;filters=HpDate:%2220250921_1600%22&amp;#43;mgzv3configlist:%22BingQA_Encyclopedia_Layout%22&#34;&gt;
                                &lt;img src=&#34;20250926-image06.jpg&#34; alt=&#34;秋日的白杨树，鱼湖国家森林，犹他州，美国&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20250926-image07.jpg&#34;
                                 data-src=&#34;20250926-image07.jpg&#34; 
                                 data-alt=&#34;航拍中国江苏省常州翠竹公园&#34; 
                                 data-desc=&#34;又是一年的秋分时节，众所周知，在这一天，全球各地昼夜的时间几乎是相等的。在幅员辽阔的中国，自南向北开始，秋季在每个地区有着不同颜色和不同的温度。大部分地区雨季在此时刚刚结束，秋天的凉意才刚刚开始，此时正是碧空万里，风和日丽的时节。中国的秋季颜色是叠翠鎏金的，许多植物的颜色由此时节开始，由苍翠的绿转为金黄或者橙红色。   今天我们的图片中正是秋季最具代表性的红色落羽杉，它们位于江苏省常州的翠竹公园，每年秋冬季节，落羽杉皆呈现出金黄至橙红色的渐变，搭配九曲回廊与水上栈道，是一派诗意盎然的江南秋季风景。&#34;
                                 data-link=&#34;https://cn.bing.com/search?q=%e7%a7%8b%e5%88%86&amp;amp;form=hpcapt&amp;amp;filters=HpDate:%2220250922_1600%22&amp;#43;mgzv3configlist:%22BingQA_Encyclopedia_Layout%22&#34;&gt;
                                &lt;img src=&#34;20250926-image07.jpg&#34; alt=&#34;航拍中国江苏省常州翠竹公园&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20250926-image08.jpg&#34;
                                 data-src=&#34;20250926-image08.jpg&#34; 
                                 data-alt=&#34;海獭，威廉王子湾，阿拉斯加州，美国&#34; 
                                 data-desc=&#34;它们圆溜溜的眼睛背后藏着更多故事。每年一度的海獭认知周，正是为了彰显它们在维护沿海生态系统中的重要作用。这项由非营利环保组织“野生动物保护者”于2003年发起的活动，致力于推动公众教育与实际行动。在阿拉斯加威廉王子湾，海獭或漂浮于冰面，或如今日图片所示，用它们最爱的石头在腹部敲开贝壳。更不为人知的是，它们对海胆的食欲如何助力保护海藻森林。   人们常看到它们成群结队地漂浮在水面上，用爪子相互连接，显得十分安详——但它们的历史却讲述着截然不同的故事。从1741年到1911年，海獭因其浓密的皮毛而遭到大规模捕杀，濒临灭绝的边缘，后来通过保护才得以恢复。然而，危险依然存在。石油泄漏、渔具缠绕、疾病侵袭以及海洋变暖持续威胁着它们的生存。海獭依赖洁净的冷水环境，其皮毛并非防水——而是通过锁住空气来保暖，任何油污污染都可能致命。本周旨在唤起人们对它们的关注，并守护它们赖以生存的水域家园。&#34;
                                 data-link=&#34;https://cn.bing.com/search?q=%e6%b5%b7%e7%8d%ad&amp;amp;form=hpcapt&amp;amp;filters=HpDate:%2220250920_1600%22&amp;#43;mgzv3configlist:%22BingQA_Encyclopedia_Layout%22&#34;&gt;
                                &lt;img src=&#34;20250926-image08.jpg&#34; alt=&#34;海獭，威廉王子湾，阿拉斯加州，美国&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20250926-image09.jpg&#34;
                                 data-src=&#34;20250926-image09.jpg&#34; 
                                 data-alt=&#34;千岛群岛地区，圣劳伦斯河，美加边境&#34; 
                                 data-desc=&#34;听到“千岛”这个词，你可能会想到一罐沙拉酱，但在这浓郁的酱汁背后，是北美最迷人的地区之一。千岛群岛是圣劳伦斯河上的一个群岛，横跨美国纽约州和加拿大安大略省。它由1800多个岛屿组成。有些岛屿上矗立着童话般的城堡，有些岛屿则狭小得几乎容不下一张吊床。此外，还有一座名为“刚好够住的岛”（Just Room Enough Island），岛上只有一栋房子和一棵孤树，名副其实。   该地区非常适合慢节奏的探索。乘船游览将带您经过宏伟的庄园和历史悠久的灯塔，途中常会停靠伯特城堡（Boldt Castle）和辛格城堡（Singer Castle）等标志性景点。皮划艇爱好者被该地区清澈的海水和宁静的海湾所吸引。得益于独特的微气候，当地酿酒师酿造出屡获殊荣的葡萄酒，值得一试。哦，还有沙拉酱？传说中，一位当地钓鱼向导的妻子首次为晚宴客人制作了这道酱料，其中包括女演员梅·欧文，她对这道酱料赞不绝口，甚至请求获得了配方。正如人们所说，这段历史堪称美味传奇。&#34;
                                 data-link=&#34;https://cn.bing.com/search?q=%e5%8d%83%e5%b2%9b%e7%be%a4%e5%b2%9b&amp;#43;%e5%8c%97%e7%be%8e%e6%b4%b2&amp;amp;form=hpcapt&amp;amp;filters=HpDate:%2220250918_1600%22&amp;#43;mgzv3configlist:%22BingQA_Encyclopedia_Layout%22&#34;&gt;
                                &lt;img src=&#34;20250926-image09.jpg&#34; alt=&#34;千岛群岛地区，圣劳伦斯河，美加边境&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20250926-image10.jpg&#34;
                                 data-src=&#34;20250926-image10.jpg&#34; 
                                 data-alt=&#34;邓金码头的蛇形楼梯，凯里郡，爱尔兰&#34; 
                                 data-desc=&#34;这片令人惊叹的景色——天空与大西洋的浩瀚水域相接之处——只能徒步抵达。位于爱尔兰荒野而美丽的丁格尔半岛上，邓金码头是凯里郡最适合拍照的景点之一。这座小型码头以蜿蜒曲折的盘山小径闻名，小径如丝带般在悬崖边剧烈蜿蜒而下。这些陡峭的弯道不仅带来刺激感，更是通往下方码头的唯一路径，从这里出发的船只将驶向偏远的布拉斯凯特群岛。   附近的邓金村（爱尔兰语：Dún Chaoin）是爱尔兰最西端的聚居地，拥有壮丽的视野和深厚的爱尔兰文化底蕴。邓金人口仅略超过100人，以浓厚的盖尔语传统、故事讲述和与布拉斯克特群岛作家们的联系而闻名。游客常会造访布拉斯克特中心，这座文化博物馆讲述了岛上生活与移民的故事。无论您是被壮丽的自然景观吸引，还是被丰富的文化遗产所打动，邓金都提供了一种独特而永恒的爱尔兰体验，令人难忘。&#34;
                                 data-link=&#34;https://cn.bing.com/search?q=%e4%b8%81%e6%a0%bc%e5%b0%94%e5%8d%8a%e5%b2%9b&amp;amp;form=hpcapt&amp;amp;filters=HpDate:%2220250917_1600%22&amp;#43;mgzv3configlist:%22BingQA_Encyclopedia_Layout%22&#34;&gt;
                                &lt;img src=&#34;20250926-image10.jpg&#34; alt=&#34;邓金码头的蛇形楼梯，凯里郡，爱尔兰&#34; loading=&#34;lazy&#34;&gt;
                            &lt;/div&gt;
                        
                            &lt;div class=&#34;gallery-slide&#34; 
                                 data-thumb=&#34;20250926-image11.jpg&#34;
                                 data-src=&#34;20250926-image11.jpg&#34; 
                                 data-alt=&#34;奥林匹克国家公园的瀑布，华盛顿，美国&#34; 
                                 data-desc=&#34;奥林匹克国家公园拥有罕见的多元地形——这正是其独特魅力所在。这里汇