巴哈姆特 文章模版存储器 (本地)

存储文章模版到本地存储并供检索

// ==UserScript==
// @name         巴哈姆特 文章範本儲存器 (本地)
// @name:zh-TW   巴哈姆特 文章範本儲存器 (本地)
// @name:zh-CN   巴哈姆特 文章模版存储器 (本地)
// @name:ja      バハムート 文章テンプレートストレージ(ローカル)
// @name:en      Bahamut Article Template Repository (Local)

// @version      1.3
// @author       Scott

// @description         儲存文章範本到本地儲存並供檢索
// @description:zh-TW   儲存文章範本到本地儲存並供檢索
// @description:zh-CN   存储文章模版到本地存储并供检索
// @description:ja      記事のテンプレートをローカルに保存して検索に使用します
// @description:en      Save article template to local storage for retrieval.

// @namespace    https://www.youtube.com/c/ScottDoha

// @match        *://forum.gamer.com.tw/*
// @grant        GM_setValue
// @grant        GM_getValue
// @license      MIT

// ==/UserScript==


(function() {
    'use strict';
 
    // 檢測用戶操作系統語言
    var userLang = navigator.language || navigator.userLanguage;
 
    // 根據用戶語言初始化不同的默認模板
    window.defaultTemplates = {};
    
    if (userLang.startsWith('zh-CN')) { // 簡體中文
        window.defaultTemplates = {
            "模版 1": "这是模版1的内容。",
            "模版 2": "这是模版2的内容。",
            "模版 3": "这是模版3的内容。",
            "模版 4": "这是模版4的内容。",
            "模版 5": "这是模版5的内容。"
        };
    } else if (userLang.startsWith('zh')) { // 繁體中文
        window.defaultTemplates = {
            "範本 1": "這是範本1的內容。",
            "範本 2": "這是範本2的內容。",
            "範本 3": "這是範本3的內容。",
            "範本 4": "這是範本4的內容。",
            "範本 5": "這是範本5的內容。"
        };
    } else if (userLang.startsWith('en')) { // 英文
        window.defaultTemplates = {
            "Template 1": "This is the content of Template 1.",
            "Template 2": "This is the content of Template 2.",
            "Template 3": "This is the content of Template 3.",
            "Template 4": "This is the content of Template 4.",
            "Template 5": "This is the content of Template 5."
        };
    } else if (userLang.startsWith('ja')) { // 日文
        window.defaultTemplates = {
            "テンプレート 1": "これはテンプレート1の内容です。",
            "テンプレート 2": "これはテンプレート2の内容です。",
            "テンプレート 3": "これはテンプレート3の内容です。",
            "テンプレート 4": "これはテンプレート4の内容です。",
            "テンプレート 5": "これはテンプレート5の内容です。"
        };
    } else { // 默認使用英文
        window.defaultTemplates = {
            "Template 1": "This is the content of Template 1.",
            "Template 2": "This is the content of Template 2.",
            "Template 3": "This is the content of Template 3.",
            "Template 4": "This is the content of Template 4.",
            "Template 5": "This is the content of Template 5."
        };
    }
 
    // 加載已保存的範本或使用初始範本
    var savedTemplates = GM_getValue('savedTemplates', window.defaultTemplates);
 
    // 創建樣式表
    var style = document.createElement('style');
    style.textContent = `
        /* 使用嵌套選擇器提升優先級 */
        .c-post__header h3 .input-template {
            position: absolute !important;
            font-weight: bold !important; /* 確保字體加粗 */
            right: 205px !important;
            width: 80px !important;
            top: 20px !important;
            background-color: #272728 !important;
            color: white !important;
            border: none !important;
            z-index: 2 !important;
            display: inline-block !important;
        }
    `;
    document.head.appendChild(style);
 
    // 找到要插入 <br> 的元素
    var targetElement = document.querySelector('div.c-post__body');
    
    // 檢查目標元素是否存在
    if (targetElement) {
        // 創建兩個 <br> 標籤並插入到目標元素上方
        for (var i = 0; i < 2; i++) {
            var br = document.createElement('br');
            targetElement.insertAdjacentElement('beforebegin', br);
        }
    }
 
    // 創建作者信息
    var authorInfo = document.createElement('div');
    authorInfo.textContent = 'by Scottdoha';
    authorInfo.style.cssText = 'display: inline-block; margin-right: 20px; width: 200px; text-align: right;';
    
    // 創建下拉選擇框
    var selectTemplate = document.createElement('select');
    selectTemplate.className = 'dropdown-group dropdown-group-primary';
    selectTemplate.style.cssText = `
        margin-right: 10px;
        display: inline-block;
        width: 110px;
        right: 5px;
        color: transparent !important;
    `;
 
    // 添加範本選項
    for (var templateName in savedTemplates) {
        var option = document.createElement('option');
        option.value = templateName;
        option.textContent = templateName;
        selectTemplate.appendChild(option);
    }
 
    // 範本下拉選單改變事件處理
    selectTemplate.addEventListener('change', function() {
        var selectedTemplateName = selectTemplate.value;
        var iframe = document.querySelector('iframe#editor');
        if (iframe) {
            var iframeDocument = iframe.contentDocument || iframe.contentWindow.document;
            var bodyElement = iframeDocument.querySelector('body.editstyle > div');
            if (bodyElement) {
                bodyElement.innerHTML = savedTemplates[selectedTemplateName];
                // 同時更新輸入框
                inputTemplateName.value = selectedTemplateName; // 更新輸入框為當前選中的範本名稱
            } else {
                alert('未找到具體的編輯器區域元素');
            }
        } else {
            alert('未找到 iframe 元素');
        }
    });
 
    // 初始化元素樣式
    var inputTemplateName = document.createElement('input');
    inputTemplateName.type = 'text';
    inputTemplateName.placeholder = '範本名稱';
    inputTemplateName.className = 'input-template';
    
    // 設置行內樣式以覆蓋頁面樣式
    inputTemplateName.style.cssText = `
        position: absolute !important;
        font-weight: bold !important; /* 確保字體加粗 */
        right: 205px !important;
        width: 80px !important;
        top: 20px !important;
        background-color: transparent !important;
        color: red !important;
        border: none !important;
        z-index: 2 !important;
        display: inline-block !important;
    `;
 
    // 創建“保存範本”按鈕
    var saveButton = document.createElement('button');
    saveButton.textContent = '保存範本';
    saveButton.style.marginRight = '5px';
    saveButton.addEventListener('click', function(event) {
        event.preventDefault();
        event.stopPropagation();
        
        var templateName = inputTemplateName.value.trim() || selectTemplate.value;
        if (templateName === '') {
            alert('請輸入範本名稱!');
            return;
        }
 
        var iframe = document.querySelector('iframe#editor');
        if (iframe) {
            var iframeDocument = iframe.contentDocument || iframe.contentWindow.document;
            var bodyElement = iframeDocument.querySelector('body.editstyle > div');
            if (bodyElement) {
                savedTemplates[templateName] = bodyElement.innerHTML;
                GM_setValue('savedTemplates', savedTemplates);
 
                selectTemplate.innerHTML = '';
                for (var name in savedTemplates) {
                    var option = document.createElement('option');
                    option.value = name;
                    option.textContent = name;
                    selectTemplate.appendChild(option);
                }
                alert('範本已保存!');
            } else {
                alert('未找到具體的編輯器區域元素');
            }
        } else {
            alert('未找到 iframe 元素');
        }
    });
 
    // 創建“刪除範本”按鈕
    var deleteButton = document.createElement('button');
    deleteButton.textContent = '刪除範本';
    deleteButton.addEventListener('click', function(event) {
        event.preventDefault();
        event.stopPropagation();
        var selectedTemplateName = selectTemplate.value;
        if (confirm('確定要刪除選中的範本嗎?')) {
            delete savedTemplates[selectedTemplateName];
            GM_setValue('savedTemplates', savedTemplates);
 
            selectTemplate.innerHTML = '';
            for (var name in savedTemplates) {
                var option = document.createElement('option');
                option.value = name;
                option.textContent = name;
                selectTemplate.appendChild(option);
            }
            alert('範本已刪除!');
        }
    });
 
    // 創建輸入框和按鈕容器
    var inputContainer = document.createElement('div');
    inputContainer.style.marginTop = '0px';
    inputContainer.style.float = 'right';
 
    // 添加元素到容器中
    inputContainer.appendChild(authorInfo);  // 添加作者信息
    inputContainer.appendChild(selectTemplate);
    inputContainer.appendChild(inputTemplateName);
    inputContainer.appendChild(saveButton);
    inputContainer.appendChild(deleteButton);
 
    // 將容器添加到頁面中
    document.querySelector('.c-post__header h3').insertAdjacentElement('afterend', inputContainer);
})();