中國傳統的

Minecraft 和 MCPACK 檔案

最後更新時間: 2025 年 2 月 27 日 什麼是 Minecraft? Minecraft 是一款全球知名的沙盒遊戲,提供無與倫比的創意自由,讓玩家可以在程序生成的世界中探索、建造和生存。自 2009 年的 alpha 版發行及 2011 年正式推出後,Minecraft 已成為有史以來最暢銷的電子遊戲,銷量超過 3 億份。其開放式遊戲性、模塊化創造的能力以及社群驅動的內容創作都促成了其持久的成功。為 Minecraft 提供自訂功能的關鍵組成部分之一便是 MCPACK 檔案格式,玩家可利用其修改遊戲中的材質、聲音和行為。 Minecraft 的開放式特性 Minecraft 的獨特之處在於它沒有強制性的目標,讓玩家可以自訂自己的目標。儘管遊戲包括可選的成就系統,但核心體驗仍然圍繞著採礦資源、製造物品及使用積木構建復雜結構。玩家與由森林、沙漠、叢林和山脈等不同生物群系組成的廣闊程序生成世界進行互動。 遊戲的一大亮點是 紅石(Redstone),這是一種材料,可讓玩家創建複雜的電路、自動機械和邏輯閘。這導致了遊戲中的電腦、工作中的計算器甚至簡單的人工智能的開發,展現了 Minecraft 的深度和靈活性。 遊戲模式 Minecraft 提供了不同的遊戲模式,以滿足各種遊玩風格。 生存模式 在 生存模式 中,玩家必須收集木材和石頭等自然資源來製造工具、建造庇護所,並防禦在黑暗區域生成的敵對生物。該模式具有 健康條 和 飢餓條,需要玩家管理食物供應來維持健康。 玩家可以通過採礦、冶煉、繁殖動物和戰鬥獲得 經驗值。這些經驗值可以用於 附魔工具、武器和盔甲,提升其耐用性和效能。 當玩家死亡時,他們會掉落他們的物品庫,若能在物品於五分鐘後 消失 前返回該位置,則可以取回。預設的重生點設在世界生成點,但可以使用 床 或 重生錨 來調整。 生存模式有兩個變體: 極限模式(Hardcore Mode):運作如生存模式但具有 永久死亡 —— 若玩家死亡,無法重生必須刪除世界或以觀眾模式遊玩。 冒險模式(Adventure Mode):專為自定義地圖設計,此模式 限制玩家直接修改世界,要求他們遵循地圖創作者設置的預定規則。 創造模式 在 創造模式 中,玩家擁有 所有物品的無限存取權限,可隨意放置或移除方塊。玩家可以 自由飛行,而且不會受到傷害或感到飢餓,這使得此模式成為 建造大型專案、測試機械或紅石裝置試驗 的理想選擇。 MCPACK 檔案在 生存和創造模式中 都扮演關鍵角色,因為它們允許玩家修改材質、聲音和遊戲機制,以創造符合其偏好的自訂遊戲體驗。
2月 27, 2025 · 2 min · Shakeel Faiz

PostScript: 一個清晰的解說

最後更新: 2025年2月20日 什麼是 PostScript? PostScript (PS) 是一種由 Adobe Systems 在1982年開發的 頁面描述語言 (PDL)。它主要用於桌面出版、印刷及圖形設計中,用來描述文字和圖像如何在頁面上呈現。 PostScript (PS) 的解說 PostScript (PS) 同時是一種 頁面描述語言 (PDL) 和一種 程序設計語言,具有 動態類型 和 基於堆疊 的特性。以下是其詳情: 1. 什麼是頁面描述語言 (PDL)? 頁面描述語言定義了圖形和文字在打印或顯示屏上的顯示方式。PostScript 用於打印機、出版軟體和數字排版中,以精確地渲染字體、圖像和佈局。 2. 什麼是基於堆疊的程式語言? PostScript 使用堆疊來處理指令,這意味著它遵循 後進先出 (LIFO) 原則。例如,要在 PostScript 中添加兩個數字,你需將它們推入堆疊,然後調用運算符來處理: 10 20 add 這為 10 和 20 推入堆疊,然後 add 命令將它們彈出並將結果 (30) 再次推入堆疊。 3. 動態類型 PostScript 不需要顯式的類型定義。變量可以容納不同類型(數字、字串、數組等)而不需預先定義類型。 4. PostScript 的用途 PostScript 主要用於桌面出版和電子出版,這意味著它助於創建和打印高質量文檔,具有對字體、佈局和圖形的精確控制。 5. 圖靈完備語言 作為 圖靈完備 意味著 PostScript 理論上可以執行任何計算,只要有足夠的記憶體和時間。這意味著它可用於一般的程式設計任務,而不僅僅是打印。 6. 歷史與發展 Adobe Systems 於 1982到1984年間開發。 由 John Warnock、Charles Geschke、Doug Brotz、Ed Taft 和 Bill Paxton 創立。 最新版本 PostScript 3 發於 1997年,其增加了更好的性能、顏色管理以及圖像壓縮。 PostScript 的歷史 PostScript 的起源可追溯至 1976年,當時 John Gaffney 在 Evans & Sutherland 工作中開發了頁面描述語言的概念,並建造了一個圖形數據庫。與此同時,Xerox PARC 正在開發 激光打印機,並需要一個標準來定義頁面圖像。最先他們創建了 Press 格式,後來在1978年發展成 Interpress,由 John Gaffney 和 Martin Newell 開發。
2月 12, 2025 · 4 min · Shakeel Faiz

GEDCOM 檔案格式與 FamilySearch

最後更新: 2025年2月7日 什麼是 GEDCOM? GEDCOM (Genealogical Data Communication) 是一種設計用來存儲、交換和共享家譜資料(家譜信息)的開放檔案格式。它廣泛用於家譜軟體和網站,使得在不同平台之間傳輸家譜資料變得更加容易。 誰開發了 GEDCOM? GEDCOM 是由耶穌基督後期聖徒教會(LDS教會)創建的,該教會運營著一個主要的家譜研究組織——FamilySearch。他們的目標是簡化家譜資料的管理,並促進更好的研究合作。 GEDCOM 如何運作? GEDCOM 檔案是純文字檔案(從第 7.0 版開始使用 UTF-8 編碼)。 它們包含有關個體的信息,如: 姓名 出生和死亡日期 家庭關係(父母、子女、配偶) 事件(婚姻、移民等) 這些記錄使用元數據進行鏈接,以確保家族成員之間的正確連接。 GEDCOM 版本與行業標準 最新的正式版本是 GEDCOM 7.0,於 2021 年發布。 然而, GEDCOM 5.5.1(自 1999 年發布,於 2019 年完成)仍然是最廣泛使用的標準。 因為 GEDCOM 5.5.1 存在限制,一些家譜軟體開發者創建了自定義擴展如**GEDCOM 5.5 EL(擴展位置)**來改進它。 GEDCOM 7.0 的採用 FamilySearch 計劃在 2022 年第三季度支持 GEDCOM 7.0。 Ancestry.com 也表示有興趣採用它,但尚未提供確切的實施日期。 為什麼 GEDCOM 很重要? 跨平台兼容性 – 允許用戶在不同的家譜網站和軟體之間移動家譜資料。 長期資料存儲 – 確保家譜資料以標準化格式保持可訪問。 家譜合作 – 使研究人員和家族歷史學家能夠有效地共享和合併資料。 GEDCOM 資料模型的解釋 GEDCOM 使用一種家譜鏈接資料模型,以結構化的方式組織家庭關係。它基於核心家庭概念,意味著它是以父母和子女的關係,而不僅僅是個體來記錄。
2月 7, 2025 · 3 min · Shakeel Faiz

用 Python 處理 PDF 文件

最後更新: 2025年1月29日 在本文中,我們將指導您如何使用 Python 處理 PDF 文件。為此,我們將使用 pypdf 庫。 使用 pypdf 庫,我們將演示如何在 Python 中執行以下操作: 從 PDF 中提取文本 旋轉 PDF 頁面 合併多個 PDF 將 PDF 拆分為單獨文件 向 PDF 頁面添加水印 注意:本文涵蓋了許多有價值的細節,因此隨時跳至您最感興趣的部分!內容組織便於導航,以便您可以快速專注於最相關的內容。 範例代碼 您可以從以下鏈接下載本文中使用的所有範例代碼。它包含代碼、輸入文件和輸出文件。 用 Python 處理 PDF 文件的代碼範例和輸入文件 安裝 pypdf 要安裝 pypdf,只需在終端或命令提示符中運行以下命令: pip install pypdf 注意:上述命令對大小寫敏感。 1. 使用 Python 從 PDF 文件中提取文本 代碼解釋 1. 創建 PDF 讀取器對象 reader = PdfReader(pdf_file) PdfReader(pdf_file) 將 PDF 文件加載到 讀取器對象中。 這個對象允許訪問頁面及其內容。 2. 遍歷頁面 for page_number, page in enumerate(reader.
1月 29, 2025 · 3 min · Shakeel Faiz

建立或編輯 #EXTM3U 文件時常見的錯誤及修復方法

最後更新: 2025年1月16日 我們已經在之前的文章中討論了 #EXTM3U 文件的關鍵元素和重要相關主題。請檢視這些內容。 #EXTM3U的介紹 如何手動創建 M3U 播放列表文件使用 #EXTM3U 在本文中,我們將討論用戶在建立或編輯 #EXTM3U 文件時常見的錯誤。 #EXTM3U 播放列表的關鍵語法元素 #EXTM3U: 這是播放列表文件的第一行,表示該文件是一個擴展的 M3U 播放列表。 #EXTINF:,: 這一行提供媒體文件的持續時間(以秒為單位),接著是曲目的標題。 <duration>: 媒體文件的持續時間,以秒為單位。 <title>: 曲目的名稱或標題。如果未提供標題,可以省略,將使用文件名替代。 <file_path>: 此行包含實際媒體文件的文件路徑。根據文件的位置,這可以是相對路徑或絕對路徑。 #EXTM3U 文件的結構: #EXTM3U 文件的結構相對簡單,由一個標頭和幾個條目組成,每個條目代表一個媒體文件。以下是結構的分解: 標頭行: 文件以 #EXTM3U 開始,標識其為擴展的 M3U 播放列表。 曲目條目: 每個曲目條目由兩行組成: 第一行以 #EXTINF: 開頭,提供持續時間和標題。 第二行提供實際媒體文件的文件路徑或 URL。 完整的 #EXTM3U 文件範例: #EXTM3U #EXTINF:215,Song A C:\Music\songA.mp3 #EXTINF:300,Song B C:\Music\songB.mp3 #EXTINF:180,Song C http://example.com/songC.mp3 播放列表以 #EXTM3U 開始。 第一個曲目 “Song A” 的持續時間為 215 秒,文件位於 C:\Music\songA.mp3。 第二個曲目 “Song B” 的持續時間為 300 秒,位於 C:\Music\songB. </section> <footer class="entry-footer"><span title='2025-01-16 00:00:00 +0000 UTC'>1月 16, 2025</span> · 1 min · Shakeel Faiz</footer> <a class="entry-link" aria-label="post link to 建立或編輯 #EXTM3U 文件時常見的錯誤及修復方法" href="https://blog.fileformat.com/zh-hant/audio/common-errors-when-creating-or-editing-extm3u-files-and-how-to-fix-them/"></a> </article> <article class="post-entry"> <header class="entry-header"> <h2>使用 Python 從 PDF 文件提取文本 </h2> </header> <section class="entry-content-home"> 最後更新:2025 年 1 月 15 日 使用 Python 從 PDF 文件提取文本 在本文中,我們將告訴您如何使用 Python 從 PDF 文件中提取文本。 PDF 代表便攜式文檔格式,是一種流行的數位文檔格式。此格式設計為使文檔無論在何種軟體、硬體或操作系統上都能輕鬆和可靠地查看或共享。PDF 文件的擴展名為 .pdf。 若要使用 Python 從 PDF 文件中提取文本,通常會用到以下這些庫。我們將向您展示如何使用這兩個庫中的任一個來從 PDF 中提取文本。 pypdf PyMuPDF 如何在 Python 中使用 pypdf 從 PDF 文件中提取文本 以下是步驟。 安裝 pypdf 運行本文提供的代碼 查看輸出 安裝 pypdf 您可以使用以下命令安裝 pypdf pip install pypdf 使用 pypdf 從 PDF 中提取文本的示例代碼 sample.pdf - 下載鏈接(此示例 PDF 將在代碼中使用,當然您也可以使用自己的 PDF。) sample.pdf 的截圖 代碼 下面是一個用於使用 pypdf 從 PDF 中提取文本的完整代碼示例。 輸出 以下是上面提供的示例代碼的輸出。 如何在 Python 中使用 PyMuPDF 從 PDF 文件中提取文本 以下是步驟。 </section> <footer class="entry-footer"><span title='2025-01-15 00:00:00 +0000 UTC'>1月 15, 2025</span> · 1 min · Shakeel Faiz</footer> <a class="entry-link" aria-label="post link to 使用 Python 從 PDF 文件提取文本" href="https://blog.fileformat.com/zh-hant/programming/extract-text-from-pdf-file-using-python/"></a> </article> <article class="post-entry"> <header class="entry-header"> <h2>如何手動創建 M3U 播放列表文件與 #EXTM3U </h2> </header> <section class="entry-content-home"> 最後更新: 2025 年 1 月 14 日 M3U 和 #EXTM3U 之間的主要區別在於它們在播放列表文件中的功能和用途。M3U 是基本的播放列表文件格式。它僅僅列出了媒體文件的位置(URL 或文件路徑),一行一個,沒有任何附加元數據。而 #EXTM3U 是 M3U 的擴展版本。它通過 #EXTINF 標籤支持額外的元數據,允許您在每個媒體條目之前添加曲目名稱、時長等信息。 如何手動創建 M3U 播放列表文件? 創建 M3U 播放列表文件非常簡單。以下是您可以手動完成的方法: 打開文本編輯器: 使用 Notepad(Windows)或 TextEdit(Mac)。 以 M3U 頭部開始: 第一行必須是 #EXTM3U,以指示這是擴展的 M3U 文件。 添加媒體條目: 每個媒體文件(音頻或視頻)都應該有自己的條目。例如: #EXTINF:123, Sample Song http://www.example.com/song.mp3 #EXTINF 行指定元數據如時長和標題,其後是媒體的 URL 或文件路徑。 保存文件: 使用 .m3u 擴展名保存您的文件。 範例文件和截圖 下載範例文件: 您可以從此鏈接下載一個擴展的 #EXTM3U 範例文件:Download M3U #EXTM3U Playlist 範例文件截圖: 截圖展示 VLC 如何播放 M3U 文件並顯示元數據。 如何使用 #EXTM3U 添加元數據? 在 M3U 播放列表中,元數據可以通過 #EXTINF 添加。此標籤提供有關媒體文件的額外信息,如其時長、標題等。以下是示例: </section> <footer class="entry-footer"><span title='2025-01-14 00:00:00 +0000 UTC'>1月 14, 2025</span> · 1 min · Shakeel Faiz</footer> <a class="entry-link" aria-label="post link to 如何手動創建 M3U 播放列表文件與 #EXTM3U" href="https://blog.fileformat.com/zh-hant/audio/how-to-create-add-metadata-and-use-m3u-playlist-files-for-iptv-streaming/"></a> </article> <article class="post-entry"> <header class="entry-header"> <h2>介紹 #EXTM3U </h2> </header> <section class="entry-content-home"> 最後更新: 2025年1月13日 播放列表文件在有效管理和播放數位媒體內容方面扮演著關鍵角色。有多種格式,其中一種常用於音頻和視頻串流的格式是 M3U 格式。 然而,並非所有的 M3U 文件都是相同的。#EXTM3U 格式是 M3U 的一種變體,增加了額外的功能以增強播放列表的體驗。 什麼是 #EXTM3U 及其在播放列表文件中的角色? #EXTM3U 是 M3U 格式的擴展版本,廣泛用於創建多媒體播放列表。M3U 和 #EXTM3U 之間的主要區別在於播放列表中包含的元數據。#EXTM3U 標頭表明播放列表將包含其他信息,如曲目持續時間、標題和其他屬性,這些信息在標準 M3U 文件中並不存在。 一個典型的 #EXTM3U 文件通常包含一個或多個音頻或視頻文件引用,每個引用都有描述曲目內容的元數據。這些元數據允許媒體播放器解釋媒體的更多細節,如曲目的持續時間或標題,從而增強用戶體驗。 基本 #EXTM3U 文件範例: #EXTM3U #EXTINF:123, Sample Artist - Sample Song /sample/path/song1.mp3 #EXTINF:456, Another Artist - Another Song /sample/path/song2.mp3 在這個例子中,#EXTINF 標籤提供了每個曲目的持續時間(以秒為單位)以及描述(藝術家和歌曲名稱)。緊接在 #EXTINF 標籤後的路徑是要播放的媒體文件的位置。 更多範例 範例 1:基本的 M3U 播放列表 #EXTM3U #EXTINF:123,Sample Artist - Sample Title /path/to/audio1.mp3 #EXTINF:456,Another Artist - Another Title /path/to/audio2.mp3 說明: #EXTM3U: 這是一個標頭,告訴媒體播放器這是一個擴展的 M3U 播放列表。 #EXTINF:123,Sample Artist - Sample Title: 此行包含元數據(曲目的持續時間和歌曲的標題)。 /path/to/audio1. </section> <footer class="entry-footer"><span title='2025-01-13 00:00:00 +0000 UTC'>1月 13, 2025</span> · 2 min · Shakeel Faiz</footer> <a class="entry-link" aria-label="post link to 介紹 #EXTM3U" href="https://blog.fileformat.com/zh-hant/audio/introduction-to-extm3u-enhancing-playlist-files-with-metadata/"></a> </article> <article class="post-entry"> <header class="entry-header"> <h2>什麼是 MKV 容器? </h2> </header> <section class="entry-content-home"> 什麼是 MKV 容器? MKV 代表 Matroska 視頻文件。它是一種免費且開放源代碼的多媒體容器格式,設計用來在單個文件中存儲無限制的音頻、視頻、圖像和字幕軌道。這使得它特別適合用於存儲電影、電視節目和其他多媒體內容。與傳統格式如 AVI 或 MP4 不同,MKV 可以在單個文件中容納多種類型的內容,提供了一種更靈活的方式來組織媒體。 Matroska 多媒體容器在高清視頻流和下載的世界中被廣泛使用。其開放源代碼特性意味著任何人都可以使用、修改或分發這種格式而不需要支付版稅。這使得 MKV 成為創作者和消費者尋找靈活且易於使用解決方案來存儲和分享多媒體的熱門選擇。 MKV 的主要特點 多重音軌:MKV 文件可以存儲多個視頻和音頻軌道、字幕和元數據(如章節)。這使得它非常適合多語言內容,因為您可以包含不同語言的音頻軌道和字幕以提高可訪問性。 高質量視頻和音頻:MKV 可以存儲高質量視頻格式,如 H.264、HEVC (H.265) 或 VP9,以及高解析度音頻格式,如 FLAC 或 Dolby TrueHD,提供了卓越的觀看體驗。 兼容性:MKV 得到了廣泛的媒體播放器和設備的支持,包括 VLC、Windows 媒體播放器(需要合適的編解碼器)和大多數現代智能電視。 開放源代碼且免費:MKV 格式是 Matroska 計劃 的一部分,這是一個非營利組織,提供這種格式的版稅免費許可。這有助於它的廣泛採用,因為使用這種格式沒有授權費或限制。 MKV 與其他視頻格式比較 許多用戶經常想知道 MKV 與 MP4 或 AVI 等更傳統格式的比較。儘管 MKV 與這些容器有一些相似之處,但也有顯著的不同: MP4:MP4 是一種廣泛用於流媒體和大多數設備上的回放格式。然而,MP4 在存儲多個音頻或字幕軌道方面不如 MKV 靈活。如果您正在尋找一種能夠在一個文件中容納多種媒體類型的格式,MKV 是更好的選擇。 AVI:AVI 是一種較舊的格式,其文件大小通常較大,對於現代視頻和音頻編解碼器的支持較少。雖然 MKV 可以處理 AVI 使用的相同編解碼器,但效率更高,並且對 HD 和 4K 視頻的支持更好。 MOV:MOV 文件通常由 Apple 設備和應用程序使用,而 MKV 是一種更為通用的格式。MKV 還具有更豐富的功能,支持高級功能如章節、多個字幕軌道等。 </section> <footer class="entry-footer"><span title='2025-01-06 00:00:00 +0000 UTC'>1月 6, 2025</span> · 1 min · Shakeel Faiz</footer> <a class="entry-link" aria-label="post link to 什麼是 MKV 容器?" href="https://blog.fileformat.com/zh-hant/video/what-is-mkv-container/"></a> </article> <article class="post-entry"> <header class="entry-header"> <h2>在 Python 中將 PDF 轉換為圖像 </h2> </header> <section class="entry-content-home"> 最後更新: 2025 年 1 月 27 日 如何在 Python 中將 PDF 轉換為圖像:逐步指南 將 PDF 文件轉換為圖像格式如 JPEG 或 PNG 在需要從 PDF 中提取圖像、展示文件預覽或處理視覺數據的情況下非常有用。Python 作為一種多功能的編程語言,提供了多種途徑來高效地完成此任務。 在本指南中,我們將逐步介紹如何在 Python 中將 PDF 轉換為圖像。您將學習如何使用流行的 Python 庫、代碼示例以及有用的故障排除提示來執行此操作。我們還將提供完整的代碼及其輸出圖像和所使用的樣例 PDF。 在 Python 中將 PDF 轉換為圖像所需準備 在執行代碼之前,確保您擁有正確的工具來開始此項任務。您需要安裝以下 Python 庫: Pillow: 一個受歡迎的 Python 圖像處理庫(PIL),常用於打開、操作和保存圖像文件。 pdf2image: 此庫有助於在 Python 中將 PDF 頁面轉換為圖像。它使用 Poppler 來將 PDF 頁面渲染為圖像。 安裝所需的庫 您可以使用 pip 安裝這些庫: pip install pillow pdf2image 如果您系統上尚未安裝 Poppler,可能需要單獨安裝。請在這裡查看您平台的安裝指南。 在 Python 中將 PDF 轉換為圖像的逐步指南 步驟 1: 導入必要的庫 首先導入必要的 Python 庫: </section> <footer class="entry-footer"><span title='2025-01-04 00:00:00 +0000 UTC'>1月 4, 2025</span> · 2 min · Shakeel Faiz</footer> <a class="entry-link" aria-label="post link to 在 Python 中將 PDF 轉換為圖像" href="https://blog.fileformat.com/zh-hant/programming/convert-pdf-to-image-in-python/"></a> </article> <footer class="page-footer"> <nav class="pagination"> <a class="next" href="https://blog.fileformat.com/zh-hant/page/2/">Next Page »</a> </nav> </footer> </main> <footer class="footer"> </footer> <a href="#top" aria-label="go to top" title="Go to Top (Alt + G)" class="top-link" id="top-link" accesskey="g"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 6" fill="currentColor"> <path d="M12 6H0l6-6z" /> </svg> </a> <script> (function(i, s, o, g, r, a, m) {i['ContainerizeMenuObject'] = r; i[r] = i[r] || function() {(i[r].q = i[r].q || []).push(arguments)}, i[r].l = 1 * new Date(); a = s.createElement(o),m = s.getElementsByTagName(o)[0]; a.async = 1; a.src = g; m.parentNode.append(a)})(window, document, 'script', 'https://menu.containerize.com/scripts/engine.min.js?v=1.0.1', 'fileformat-zh'); </script> <script> let menu = document.getElementById('menu') if (menu) { menu.scrollLeft = localStorage.getItem("menu-scroll-position"); menu.onscroll = function () { localStorage.setItem("menu-scroll-position", menu.scrollLeft); } } document.querySelectorAll('a[href^="#"]').forEach(anchor => { anchor.addEventListener("click", function (e) { e.preventDefault(); var id = this.getAttribute("href").substr(1); if (!window.matchMedia('(prefers-reduced-motion: reduce)').matches) { document.querySelector(`[id='${decodeURIComponent(id)}']`).scrollIntoView({ behavior: "smooth" }); } else { document.querySelector(`[id='${decodeURIComponent(id)}']`).scrollIntoView(); } if (id === "top") { history.replaceState(null, null, " "); } else { history.pushState(null, null, `#${id}`); } }); }); </script> <script> var mybutton = document.getElementById("top-link"); window.onscroll = function () { if (document.body.scrollTop > 800 || document.documentElement.scrollTop > 800) { mybutton.style.visibility = "visible"; mybutton.style.opacity = "1"; } else { mybutton.style.visibility = "hidden"; mybutton.style.opacity = "0"; } }; </script> <script> document.getElementById("theme-toggle").addEventListener("click", () => { if (document.body.className.includes("dark")) { document.body.classList.remove('dark'); localStorage.setItem("pref-theme", 'light'); } else { document.body.classList.add('dark'); localStorage.setItem("pref-theme", 'dark'); } }) </script> </body> </html>