利用ace编辑并预览markdown

<!DOCTYPE html>
<html lang="zh-CN">

<head>
    <title>ACE in Action</title>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>

<body>
    <div style="display: flex; height: 40vh;">
        <div style="flex: 50%">
            <div id="editor" style="width: 100%; height: 100%;"># ACE in Action</div>
        </div>
        <div style="flex: 50%">
            <div id="previewer" style="width: 100%; height: 100%; overflow: scroll;"></div>
        </div>
    </div>

    <script src="https://cdnjs.cloudflare.com/ajax/libs/ace/1.35.4/ace.min.js" type="text/javascript"
        charset="utf-8"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/marked/14.0.0/marked.min.js" type="text/javascript"
        charset="utf-8"></script>
    <script>
        var editor = ace.edit("editor");
        editor.setTheme("ace/theme/monokai");
        editor.setOptions({
            wrap: true,
        });
        editor.session.setMode("ace/mode/markdown");
        // 或下面设置
        // editor.session.setUseWrapMode(true);
        editor.session.on('change', function (delta) {
            const content = editor.getValue();
            document.querySelector("#previewer").innerHTML = marked.marked(content);
        });
    </script>
</body>

</html>

上面代码cdnjs缺少相应的主题,换jsdelivr正常。

<!DOCTYPE html>
<html lang="zh-CN">

<head>
    <title>ACE in Action</title>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>

<body>
    <div style="display: flex; height: 40vh;">
        <div style="flex: 50%">
            <div id="editor" style="width: 100%; height: 100%;"># ACE in Action</div>
        </div>
        <div style="flex: 50%">
            <div id="previewer" style="width: 100%; height: 100%; overflow: scroll;"></div>
        </div>
    </div>

    <script src="https://cdn.jsdelivr.net/npm/ace-builds@1.35.4/src-min-noconflict/ace.js" type="text/javascript"
        charset="utf-8"></script>
    <script src="https://cdn.jsdelivr.net/npm/marked@14.0.0/lib/marked.umd.min.js" type="text/javascript"
        charset="utf-8"></script>
    <script>
        var editor = ace.edit("editor");
        editor.setTheme("ace/theme/monokai");
        editor.session.setMode("ace/mode/markdown");
        editor.session.setUseWrapMode(true);
        editor.session.on('change', function (delta) {
            const content = editor.getValue();
            document.querySelector("#previewer").innerHTML = marked.marked(content);
        });
    </script>
</body>

</html>

esm导入方式:

<!DOCTYPE html>
<html lang="zh-CN">

<head>
  <title>ACE in Action</title>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>

<body>
  <div style="display: flex; height: 40vh;">
    <div style="flex: 50%">
      <div id="editor" style="width: 100%; height: 100%;"># ACE in Action</div>
    </div>
    <div style="flex: 50%">
      <div id="previewer" style="width: 100%; height: 100%; overflow: scroll;"></div>
    </div>
  </div>

  <script type="module">
    import ace from 'https://esm.run/ace-builds';
    import { marked } from 'https://esm.run/marked';

    ace.config.set('basePath', 'https://cdn.jsdelivr.net/npm/ace-builds@1.35.4/src-min-noconflict/');
    const editor = ace.edit("editor");
    editor.setTheme("ace/theme/monokai");
    editor.session.setMode("ace/mode/markdown");
    editor.session.setUseWrapMode(true);
    editor.session.on('change', function (delta) {
      const content = editor.getValue();
      document.querySelector("#previewer").innerHTML = marked(content);
    });
  </script>
</body>

</html>

或如下方式:

<!DOCTYPE html>
<html lang="zh-CN">

<head>
  <title>ACE in Action</title>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>

<body>
  <div style="display: flex; height: 40vh;">
    <div style="flex: 50%">
      <div id="editor" style="width: 100%; height: 100%;"># ACE in Action</div>
    </div>
    <div style="flex: 50%">
      <div id="previewer" style="width: 100%; height: 100%; overflow: scroll;"></div>
    </div>
  </div>

  <script type="module">
    import ace from 'https://esm.run/ace-builds/src-min-noconflict/ace.js';
    import { marked } from 'https://esm.run/marked';

    ace.config.set('basePath', 'https://cdn.jsdelivr.net/npm/ace-builds@1.35.4/src-min-noconflict/');
    const editor = ace.edit("editor");
    editor.setTheme("ace/theme/monokai");
    editor.session.setMode("ace/mode/markdown");
    editor.session.setUseWrapMode(true);
    editor.session.on('change', function (delta) {
      const content = editor.getValue();
      document.querySelector("#previewer").innerHTML = marked(content);
    });
  </script>
</body>

</html>
posted @   卓能文  阅读(49)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
点击右上角即可分享
微信分享提示