// ==UserScript== // @name 【编程猫社区】多语法支持 // @namespace codemao // @version 1.1.0 // @description 在编程猫社区使用Markdown/LaTeX语法发布帖子 // @author 简单得不简单 // @require https://cdn.staticfile.org/jquery/3.6.0/jquery.min.js // @require https://greasyfork.org/scripts/425827-editormd-js/code/editormdjs.js // @require https://greasyfork.org/scripts/34138-marked-js/code/markedjs.js // @require https://greasyfork.org/scripts/425847-prettify-js/code/prettifyjs.js // @resource editormd https://jddbjd.gitee.io/editor.md/css/editormd.preview.css // @grant GM_getResourceText // @grant GM_addStyle // @include *://shequ.codemao.cn/community // @include *://shequ.codemao.cn/community/* // @include *://shequ.codemao.cn/work_shop/* // @downloadURL none // ==/UserScript== (function () { // 粘贴文本 function pasteText(type) { // 贴子发布表单 var forumContainer = document.getElementsByClassName(type + '-forum_sender--container')[0]; // 帖子编辑 iframe var iframeDoc = document.getElementById('react-tinymce-0_ifr').contentDocument; iframeDoc.body.innerHTML = ''; // 选择语法 var select = document.createElement('select'); var values = new Array('Markdown', 'LaTeX'); for (var i = 0; i < values.length; i++) { var option = document.createElement("option"); option.value = values[i]; option.appendChild(document.createTextNode(values[i])); select.appendChild(option); } select.options[0].selected = true; forumContainer.insertBefore(select, document.getElementsByClassName('r-community-c-forum_sender--form_item')[1]); // 粘贴文本 按钮 var btnPasteText = document.createElement('button'); btnPasteText.innerText = '粘贴相应语法文本'; btnPasteText.style = 'display: block; text-align: center; width: 100%; padding: 5px 0; margin: 5px 0; background: #fec433; border-radius: 4px; color: #fff;'; btnPasteText.onclick = function () { navigator.clipboard.readText().then(function (clipText) { // 标识帖子属于 Markdown 语法 var sign = document.createElement('pre'); sign.style = 'display: none;'; sign.innerText = select.value; // 对没安装脚本的友好提示 var explain = document.createElement('p'); explain.innerText = '本文使用了由社区用户简单得不简单(https://shequ.codemao.cn/user/2776410)提供的油猴脚本:多语法支持,请先安装此脚本'; var code = document.createElement('pre'); // 存放 Markdown 代码 code.style = 'display: none;'; code.appendChild(document.createTextNode(clipText)); iframeDoc.body.innerHTML = ''; iframeDoc.body.appendChild(sign); iframeDoc.body.appendChild(explain); iframeDoc.body.appendChild(code); }); } // 将按钮添加到表单底部 forumContainer.appendChild(btnPasteText); // 提示文本 var textExplain = document.createElement('a'); textExplain.style = 'display: block; text-align: center; width: 100%; padding: 5px 0; margin: 5px 0; background: #fec433; border-radius: 4px; color: #fff;'; textExplain.innerText = '点击进入编辑器'; textExplain.href = 'https://jddbjd.gitee.io/editor.md/'; textExplain.target = '__blank'; textExplain.title = '点击进入编辑器'; // 将文本添加到表单底部 forumContainer.appendChild(textExplain); } // 修改帖子页面的 HTML 为 Markdown 渲染后的 HTML function modify() { // 获取帖子内容 var forumContent = document.getElementsByClassName('r-community-r-detail--forum_content')[0]; var sign = forumContent.getElementsByTagName('pre')[0].innerText; if (sign == 'Markdown') { // 注入 CSS var editormdcss = GM_getResourceText('editormd'); GM_addStyle(editormdcss); // 提取
 中的文本
            var forumText = forumContent.getElementsByTagName('pre')[1].innerText;
            // 修改其 HTML 为 Markdown
            textarea = document.createElement('textarea');
            textarea.style = 'display: none;';
            textarea.appendChild(document.createTextNode(forumText));
            forumContent.innerHTML = '';
            forumContent.appendChild(textarea);
            forumContent.className = 'markdown-body editormd-html-preview';
            forumContent.id = 'markdown';

            $(function () {
                // 渲染 Markdown
                var editor = editormd.markdownToHTML("markdown", {
                    htmlDecode: true,
                });
            });
        } else if (sign == 'LaTeX') {
            var script = document.createElement('script');
            script.type = 'module';
            script.innerText = `import { LaTeXJSComponent } from "https://cdn.jsdelivr.net/npm/latex.js/dist/latex.mjs";customElements.define("latex-js", LaTeXJSComponent);`
            document.head.appendChild(script);
            // 提取 
 中的文本
            var forumText = forumContent.getElementsByTagName('pre')[1].innerText;
            // 修改内容
            var latex = document.createElement('latex-js');
            latex.setAttribute('baseURL', 'https://cdn.jsdelivr.net/npm/latex.js/dist/');
            latex.appendChild(document.createTextNode(forumText));
            forumContent.innerHTML = '';
            forumContent.appendChild(latex);
        }
    }

    // 程序入口
    function main() {
        var path = location.pathname;
        // 判断当前页是论坛首页还是帖子页s
        if (/^\/community\/\d+\/?$/.test(path)) {
            // 帖子页
            modify();
        } else if (/^\/community\/?$/.test(path)) {
            // 论坛首页
            pasteText('r-community-c');
        } else if (/^\/work_shop\/\d+\/?$/.test(path)) {
            // 工作室
            pasteText('c-post_box');
        }
    }


    // 设置延时,在文档加载完后渲染,否则不会渲染成功
    setTimeout(main, 1000);
})();