<?php echoUOJPageHeader(UOJLocale::get('html to markdown')) ?> <h1> <?= UOJLocale::get('html to markdown') ?> </h1> <style> #html, #markdown { font-family: Cascadia Mono, Ubuntu Mono, Roboto Mono, Jetbrains Mono, Fira Code, Consolas, '思源黑体 Regular', '思源宋体 Light', '宋体', 'Courier New', monospace; width: 100%; min-height: 300px; } </style> <div class="card"> <div class="card-body"> <div class="row row-cols-1 row-cols-md-2"> <div class="col"> <textarea class="form-control" id="html" placeholder="input html here"></textarea> </div> <div class="col"> <textarea data-no-autosize readonly class="form-control" id="markdown" placeholder="output markdown here" style="height: 100%"></textarea> </div> </div> </div> <div class="card-footer bg-transparent text-end"> <a href="https://s2oj.github.io/#/user/apps/html2markdown" target="_blank">使用教程</a> </div> </div> <?= HTML::js_src('/js/turndown.js') ?> <?= HTML::js_src('/js/turndown-plugin-gfm.js') ?> <script> function mathjaxScriptBlockType(node) { if (node.nodeName !== 'SCRIPT') return null; const a = node.getAttribute('type'); if (!a || a.indexOf('math/tex') < 0) return null; return a.indexOf('display') >= 0 ? 'block' : 'inline'; } var turndownService = new TurndownService({ headingStyle: 'atx', hr: '---', bulletListMarker: '-', codeBlockStyle: 'fenced', fence: '```', emDelimiter: '_', strongDelimiter: '**', linkStyle: 'inlined', linkReferenceStyle: 'full', preformattedCode: false, }); turndownService.use(turndownPluginGfm.gfm); turndownService.addRule('mathjaxRendered', { filter: function(node) { return node.nodeName === 'SPAN' && node.getAttribute('class') === 'MathJax'; }, replacement: function(content) { return ''; } }); turndownService.addRule('mathjaxScriptInline', { filter: function(node) { return mathjaxScriptBlockType(node) === 'inline'; }, escapeContent: function() { // We want the raw unescaped content since this is what Katex will need to render // If we escape, it will double the \\ in particular. return false; }, replacement: function(content, node, options) { return '$' + content + '$'; } }); turndownService.addRule('mathjaxScriptBlock', { filter: function(node) { return mathjaxScriptBlockType(node) === 'block'; }, escapeContent: function() { return false; }, replacement: function(content, node, options) { return '$$\n' + content + '\n$$'; } }); $(document).ready(function() { $('#html').on('input', function() { $('#markdown').val(turndownService.turndown($('#html').val())); }); }); </script> <?php echoUOJPageFooter() ?>