- 新增 cdnjs.cloudflare.com CSP 白名单,允许加载 highlight.js - 消毒策略放行 span 元素,保留 highlight.js 高亮 class - 详情页和新帖子页引入 highlight.js 库和 GitHub 主题 - 代码块语言选择器默认 text,支持 prev/next 循环切换语言 - 代码块语言标签注入兼容 data-language 和 code class 双来源 - 修复 utils.js defer 导致 common.js 执行时 getCSRFToken 未定义
105 lines
5.1 KiB
HTML
105 lines
5.1 KiB
HTML
{{template "layout/header.html" .}}
|
|
<body>
|
|
|
|
{{template "layout/nav.html" .}}
|
|
|
|
<div class="editor-layout">
|
|
<form id="postForm" class="editor-form">
|
|
<input type="hidden" id="postId" value="{{if .Post}}{{.Post.ID}}{{end}}">
|
|
|
|
{{/* 标题区域 */}}
|
|
<div class="editor-header">
|
|
<input type="text" id="postTitle" class="editor-title-input"
|
|
value="{{if .Post}}{{.Post.Title}}{{end}}"
|
|
placeholder="输入文章标题..."
|
|
maxlength="200" required autofocus>
|
|
</div>
|
|
|
|
{{/* 工具栏 */}}
|
|
<div class="editor-toolbar" id="toolbar">
|
|
<button type="button" data-action="bold" title="加粗 (Ctrl+B)"><strong>B</strong></button>
|
|
<button type="button" data-action="italic" title="斜体 (Ctrl+I)"><em>I</em></button>
|
|
<button type="button" data-action="strike" title="删除线"><s>S</s></button>
|
|
<button type="button" data-action="code" title="行内代码"></></button>
|
|
<span class="toolbar-divider"></span>
|
|
<button type="button" data-action="h1" title="标题 1">H1</button>
|
|
<button type="button" data-action="h2" title="标题 2">H2</button>
|
|
<button type="button" data-action="h3" title="标题 3">H3</button>
|
|
<span class="toolbar-divider"></span>
|
|
<button type="button" data-action="bulletList" title="无序列表">•</button>
|
|
<button type="button" data-action="orderedList" title="有序列表">1.</button>
|
|
<button type="button" data-action="blockquote" title="引用">"</button>
|
|
<span class="toolbar-divider"></span>
|
|
<button type="button" data-action="codeBlock" title="代码块">{ }</button>
|
|
<select id="codeLangSelect" class="code-lang-select" style="display:none" title="选择语言">
|
|
<option value="text">text</option>
|
|
<option value="javascript">JavaScript</option>
|
|
<option value="typescript">TypeScript</option>
|
|
<option value="python">Python</option>
|
|
<option value="go">Go</option>
|
|
<option value="rust">Rust</option>
|
|
<option value="java">Java</option>
|
|
<option value="cpp">C++</option>
|
|
<option value="c">C</option>
|
|
<option value="csharp">C#</option>
|
|
<option value="ruby">Ruby</option>
|
|
<option value="php">PHP</option>
|
|
<option value="swift">Swift</option>
|
|
<option value="kotlin">Kotlin</option>
|
|
<option value="sql">SQL</option>
|
|
<option value="bash">Bash</option>
|
|
<option value="json">JSON</option>
|
|
<option value="yaml">YAML</option>
|
|
<option value="xml">XML</option>
|
|
<option value="css">CSS</option>
|
|
<option value="scss">SCSS</option>
|
|
<option value="html">HTML</option>
|
|
<option value="markdown">Markdown</option>
|
|
<option value="shell">Shell</option>
|
|
<option value="dockerfile">Dockerfile</option>
|
|
<option value="nginx">Nginx</option>
|
|
<option value="diff">Diff</option>
|
|
</select>
|
|
<button type="button" data-action="horizontalRule" title="分隔线">—</button>
|
|
<span class="toolbar-divider"></span>
|
|
<button type="button" data-action="undo" title="撤销">↩</button>
|
|
<button type="button" data-action="redo" title="重做">↪</button>
|
|
</div>
|
|
|
|
{{/* 编辑器主体 */}}
|
|
<div class="editor-main">
|
|
<div class="editor-pane" id="editorPane">
|
|
<div id="editor-container"
|
|
data-content="{{if .Post}}{{.Post.BodyHTML}}{{end}}"></div>
|
|
</div>
|
|
</div>
|
|
|
|
{{/* 状态栏 */}}
|
|
<div class="editor-statusbar">
|
|
<span class="status-item" id="wordCount">0 字</span>
|
|
<span class="status-item status-draft" id="draftStatus" style="display:none">草稿已保存</span>
|
|
<span class="status-spacer"></span>
|
|
<span class="status-item" id="btnFullscreen" style="cursor:pointer" title="全屏编辑 (F11)">全屏</span>
|
|
<button type="submit" class="btn btn-primary btn-submit">{{if .Post}}保存修改{{else}}发布帖子{{end}}</button>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
|
|
{{template "layout/footer.html" .}}
|
|
|
|
<script type="importmap">
|
|
{
|
|
"imports": {
|
|
"@tiptap/core": "https://esm.sh/@tiptap/core@3.13.0",
|
|
"@tiptap/starter-kit": "https://esm.sh/@tiptap/starter-kit@3.13.0",
|
|
"@tiptap/extension-placeholder": "https://esm.sh/@tiptap/extension-placeholder@3.13.0",
|
|
"@tiptap/extension-image": "https://esm.sh/@tiptap/extension-image@3.13.0",
|
|
"@tiptap/extension-code-block-lowlight": "https://esm.sh/@tiptap/extension-code-block-lowlight@3.13.0",
|
|
"lowlight": "https://esm.sh/lowlight@3.3.0",
|
|
"highlight.js/lib/languages/": "https://esm.sh/highlight.js@11.11.0/es/languages/"
|
|
}
|
|
}
|
|
</script>
|
|
<script src="/static/js/common.js"></script>
|
|
<script type="module" src="/static/js/editor.js"></script>
|