IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> angular12实现Markdown显示和编辑 -> 正文阅读

[JavaScript知识库]angular12实现Markdown显示和编辑

实现Markdown显示

  1. 安装 ngx-markdown

    npm install ngx-markdown --save
    
  2. 再angular.json 中引入对应的css文件和js文件

        "styles": [
                  "src/styles.css",
                  "node_modules/prismjs/themes/prism-okaidia.css",
                  "node_modules/prismjs/plugins/line-numbers/prism-line-numbers.css",
                  "node_modules/prismjs/plugins/line-highlight/prism-line-highlight.css",
                  "node_modules/katex/dist/katex.min.css"
                ],
                "scripts": [
                  "node_modules/marked/lib/marked.js",
                  "node_modules/prismjs/prism.js",
                  "node_modules/prismjs/components/prism-csharp.min.js",
                  "node_modules/prismjs/components/prism-css.min.js",
                  "node_modules/prismjs/plugins/line-numbers/prism-line-numbers.js",
                  "node_modules/prismjs/plugins/line-highlight/prism-line-highlight.js",
                  "node_modules/prismjs/components/prism-typescript.min.js",
                  "node_modules/emoji-toolkit/lib/js/joypixels.min.js",
                  "node_modules/katex/dist/katex.min.js"
                ]
    
  3. app.module.ts文件

    import { NgModule } from '@angular/core';
    + import { MarkdownModule } from 'ngx-markdown';
    import { BrowserModule } from '@angular/platform-browser';
    
    import { AppRoutingModule } from './app-routing.module';
    import { AppComponent } from './app.component';
    import { HttpClient, HttpClientModule } from '@angular/common/http';
    + import { MdShowComponent } from './md-show/md-show.component';
    @NgModule({
      declarations: [AppComponent, MdShowComponent],
      imports: [
        BrowserModule,
        AppRoutingModule,
        HttpClientModule,
       + MarkdownModule.forRoot({ loader: HttpClient }),  //如果加载md文件,需要添加该行
      ],
      providers: [],
      bootstrap: [AppComponent],
    })
    export class AppModule {}
    
  4. 通过如下方式显示code

    1. 管道

      1. typescritpMarkdown的值
         public typescriptMarkdown = `
          \`\`\`typescript
          import { Component } from '@angular/core';
        
        @Component({
          selector: 'markdown-demo',
          templateUrl: './markdown-demo.component.html',
          styleUrls: ['./markdown-demo.component.scss'],
        })
        export class MarkdownDemoComponent {
          public pipeMarkdown = '# Markdown';
        }
        \`\`\``;
        
    2. 页面

       <div [innerHTML]="typescriptMarkdown | language: 'typescript' |markdown"></div>
      
    3. 显示效果

    请添加图片描述

Markdown编辑器,angular集成editor

  1. 下载editor放到asset文件中

    https://codeload.github.com/pandao/editor.md/zip/master.zip

  2. 修改angular.json

     "styles": [
                  "src/styles.css",
                  "node_modules/prismjs/themes/prism-okaidia.css",
                  "node_modules/prismjs/plugins/line-numbers/prism-line-numbers.css",
                  "node_modules/prismjs/plugins/line-highlight/prism-line-highlight.css",
                  "node_modules/katex/dist/katex.min.css",
                  "src/assets/md_editor/css/editormd.css",
                  "src/assets/md_editor/lib/codemirror/codemirror.min.css"
                ],
      "scripts": [
                  "node_modules/marked/lib/marked.js",
                  "node_modules/prismjs/prism.js",
                  "node_modules/prismjs/components/prism-csharp.min.js",
                  "node_modules/prismjs/components/prism-css.min.js",
                  "node_modules/prismjs/plugins/line-numbers/prism-line-numbers.js",
                  "node_modules/prismjs/plugins/line-highlight/prism-line-highlight.js",
                  "node_modules/prismjs/components/prism-typescript.min.js",
                  "node_modules/emoji-toolkit/lib/js/joypixels.min.js",
                  "node_modules/katex/dist/katex.min.js",
                  "node_modules/jquery/dist/jquery.js",
                  "src/assets/md_editor/lib/flowchart.min.js",
                  "src/assets/md_editor/lib/jquery.flowchart.min.js",
                  "src/assets/md_editor/editormd.min.js",
                  "src/assets/md_editor/lib/codemirror/codemirror.min.js",
                  "src/assets/md_editor/lib/marked.min.js",
                  "src/assets/md_editor/lib/prettify.min.js",
                  "src/assets/md_editor/lib/underscore.min.js",
                  "src/assets/md_editor/lib/raphael.min.js",
                  "src/assets/md_editor/lib/sequence-diagram.min.js"
                ]
    
  3. 添加editor的配置文件editor-config.ts editor的配置在该文件中修改

    declare var $: any;
    
    export class EditorConfig {
      public path = './assets/md_editor/lib/';
      public tocm = true;
      public tocContainer = '';
      public tocDropdown = false;
      // // public width = '100%';
      // public width = '868';
      // public height = '558';
      // public codeFold = true;
      // public placeholder = '请输入正文内容'; // 输入提示
      // public searchReplace = true;
      // public toolbar = true;
      // public emoji = false; // 关闭外部emoji工具
      // public taskList = true;
      // public tex = true; // 数学公式类默认不解析
      // public readOnly = false;
      // public tocm = true;
      // public watch = false; // 是否右边展示实时预览
      // public previewCodeHighlight = true;
      // public saveHTMLToTextarea = true; // 保存HTML到Textarea中
      // public markdown = '';
      // public flowChart = true; //流程图
      // public syncScrolling = true;
      // public sequenceDiagram = true; //UML时序图
      // public imageUpload = true;
      // public imageFormats = ['jpg', 'jpeg', 'gif', 'png', 'bmp', 'webp'];
      // // public crossDomainUpload = true;
      // // public imageUploadURL = ''; // 上传图片的接口
      // // public htmlDecode = 'style,script,iframe';
      // // public uploadCallbackURL = ""
      // public htmlDecode = 'style,script,iframe,sub,sup|on*'; // 开启HTML标签解析,可以过滤html的标签解析,为了安全性,默认不开启
    
      // public toolbarIcons = function () {
      //   // Or return editormd.toolbarModes[name]; // full, simple, mini
      //   // Using "||" set icons align right.
      //   return [
      //     'bold',
      //     'italic',
      //     'h1',
      //     'h2',
      //     'del',
      //     '|',
      //     'list-ul',
      //     'list-ol',
      //     'hr',
      //     'quote',
      //     'code-block',
      //     'table',
      //     'link',
      //     'watch',
      //     '|',
      //     'fullscreen',
      //     'file',
      //     'imageUpload',
      //     '|',
      //     'undo',
      //     'redo',
      //   ];
      // };
      // public toolbarIconsClass = {
      //   imageUpload: 'fa-file-image-o', // 指定一个FontAawsome的图标类
      // };
      // public toolbarIconTexts = {
      //   // 如果没有图标,则可以这样直接插入内容,可以是字符串或HTML标签
      //   // file: `<div><input type="file" name="file" id="uploadImage" class="inputfile" style="position:absolute;opacity:0;" accept="image/png,image/jpeg,image/gif,image/jpg,image/svg" />
      //   // <label for="file" style="cursor:pointer;">上传文件</label></div>`
      // };
    
      // // 自定义工具栏按钮的事件处理
      // public toolbarHandlers = {
      //   /**
      //    * @param {Object}      cm         CodeMirror对象
      //    * @param {Object}      icon       图标按钮jQuery元素对象
      //    * @param {Object}      cursor     CodeMirror的光标对象,可获取光标所在行和位置
      //    * @param {String}      selection  编辑器选中的文本
      //    */
      //   imageUpload: function (cm: any, icon: any, cursor: any, selection: any) {
      //     // deal upload event
      //     $('#uploadImage').click();
      //     $('#uploadImage')
      //       .unbind()
      //       .bind('change', (e: any) => {
      //         let fd = new FormData();
      //         // 添加到fd对象中等待提交
      //         fd.append('files', e.target['files'][0]);
      //         if (!fd) return;
      //         $.ajax({
      //           type: 'post',
      //           url: '/api/v1/upload',
      //           data: fd,
      //           cache: false,
      //           contentType: false,
      //           processData: false,
      //           success: (data: any) => {
      //             if (data && data.length > 0) {
      //               // cm.replaceSelection("![](http://10.0.10.7:10020" + data[0] + ")" + selection);
      //               // 生产环境使用相对路径
      //               cm.replaceSelection('![](' + data[0] + ')' + selection);
      //             }
      //           },
      //         });
      //       });
      //     console.log('imageUpload =>', icon.html());
      //   },
      // };
    
      // // 用于增加自定义工具栏的功能,可以直接插入HTML标签,不使用默认的元素创建图标
      // public toolbarCustomIcons = {
      //   file: `<input type="file" name="file" id="uploadImage" class="inputfile" style="position:absolute;opacity:0;" accept="image/png,image/jpeg, image/gif,image/jpg,image/svg,image/xbm,image/pgm,image/xpm" /> `,
      // };
      // public lang = {
      //   toolbar: {
      //     imageUpload: '图片上传', // 自定义按钮的提示文本,即title属性
      //   },
      // };
    
      // public editorFunction = ''; //定义调用的方法
      public width = '90%';
      public height = 720;
      //toc           : false,         // diable ToC
      public tocStartLevel = 2; // Parse beginning of H2, Default value 1
      constructor() {}
    }
    
    
  4. 创建editor-md.directive.ts

    import {AfterViewInit, Attribute, Directive, EventEmitter, Input, Output} from '@angular/core';
    import {EditorConfig} from './model/editor-config';
    
    declare var editormd: any;
    declare var $: any;
    
    @Directive({
      selector: '[appEditorMd]'
    })
    export class EditorMdDirective implements AfterViewInit {
      @Input() editormdConfig: EditorConfig; // 配置选项
      @Output() onEditorChange: EventEmitter<string> = new EventEmitter<string>(); // 发射器
      editor: any; // editormd编辑器
    
      constructor(@Attribute('id') private id: string) {
      }
    
      ngAfterViewInit(): void {
        this.editor = editormd(this.id, this.editormdConfig); // 创建编辑器
    
        const out = this.onEditorChange;
        const textarea = $('#' + this.id + ' :first'); // 获取textarea元素
    
        // 当编辑器内容改变时,触发textarea的change事件
        this.editor.on('change', function () {
          out.emit(textarea.val());
        });
      }
    }
    
  5. editor.module.ts

    import { NgModule } from '@angular/core';
    import { CommonModule } from '@angular/common';
    
    import { EditormdRoutingModule } from './editormd-routing.module';
    import { EditormdComponent } from './editormd.component';
    import { FormsModule } from '@angular/forms';
    @NgModule({
      declarations: [EditormdComponent],
      imports: [CommonModule, EditormdRoutingModule, FormsModule],
    })
    export class EditormdModule {}
    
  6. editormd.component.ts

       import { Component, OnInit } from '@angular/core';
       import { EditorConfig } from '../editor/model/editor-config';
       declare var $: any;
       declare var editormd: any;
       @Component({
         selector: 'app-editormd',
         templateUrl: './editormd.component.html',
         styleUrls: ['./editormd.component.css'],
       })
       export class EditormdComponent implements OnInit {
         constructor() {}
       
         ngOnInit(): void {}
         editor: any;
         conf = new EditorConfig();
         public showInfo: string = ''; //编辑器内容
       
         ngAfterViewInit(): void {
           this.createEditor();
         }
       
         createEditor() {
           this.editor = editormd('markdown', this.conf); // 创建编辑器
           // //解决右侧预览偶尔显示不出来的问题(编辑功能下的md)
           $('#markdown.editormd-preview-container')[0].innerHTML = this.showInfo;
           // 在没有开预览模式下获取编辑状态下的值
           // let iputData = $('#markdown .editormd-markdown-textarea').val();
           // 编辑器事件监听
           this.editor.on('change', () => {
             const textarea = $('#editText');
             const value = {
               textarea: textarea.val(),
             };
             this.showInfo = value.textarea;
           });
         }
       }
    
  7. editormd.cmponent.html

    <div id="markdown">
      <textarea id="editText" style="display: block"></textarea>
    </div>
    
  8. 显示效果

请添加图片描述

源码路径
gitee路径

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2021-08-17 15:18:45  更:2021-08-17 15:19:25 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 9:02:03-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码