最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 【译】@ts-stack/markdown 的 README.md

    正文概述 掘金(尤小小)   2021-01-09   586

    @ts-stack/markdown

    这个项目是2017年12月1日从 chjj/release-0.3.7仓库提交记录合并请求 #961分支。

    lang

    • 中文
    • english

    目录

    • 安装
    • 使用
      • 简洁用法
      • 使用highlight示例
      • renderer重要方法
      • 设置一个简单规则示例
    • API
      • Marked的class和types的方法
      • Renderer的API
    • 使用
      • bench选项设置
        • bench选项的使用示例
    • 贡献和许可协议
    • 许可证

    安装

    npm install @ts-stack/markdown --save
    

    使用

    简洁用法:

    import { Marked } from '@ts-stack/markdown';
    
    console.log(Marked.parse('I am using __markdown__.'));
    // 输出: I am using <strong>markdown</strong>.
    

    实例使用:

    import { Marked, Renderer } from '@ts-stack/markdown';
    
    Marked.setOptions
    ({
      renderer: new Renderer,
      gfm: true,
      tables: true,
      breaks: false,
      pedantic: false,
      sanitize: false,
      smartLists: true,
      smartypants: false
    });
    
    console.log(Marked.parse('I am using __markdown__.'));
    

    使用highlight示例

    npm install highlight.js --save
    npm install @types/highlight.js -D
    

    一个可使代码块高亮的函数:

    import { Marked } from '@ts-stack/markdown';
    import { highlight } from 'highlight.js';
    
    Marked.setOptions({ highlight: (code, lang) => highlight(lang, code).value });
    let md = '```js\n console.log("hello"); \n```';
    console.log(Marked.parse(md));
    

    renderer重要方法

    renderer的选项允许你自定义设置。这有一个例子,通过添加自定义id头覆盖默认的设置。

    import { Marked, Renderer } from '@ts-stack/markdown';
    
    class MyRenderer extends Renderer
    {
      // Overriding parent method.
      heading(text: string, level: number, raw: string)
      {
        const regexp = /\s*{([^}]+)}$/;
        const execArr = regexp.exec(text);
        let id: string;
        
        if(execArr)
        {
          text = text.replace(regexp, '');
          id = execArr[1];
        }
        else
        {
          id = text.toLocaleLowerCase().replace(/[^\wа-яіїє]+/gi, '-');
        }
    
        return `<h${level} id="${id}">${text}</h${level}>`;
      }
    }
    
    Marked.setOptions({renderer: new MyRenderer});
    
    console.log(Marked.parse('# heading {my-custom-hash}'));
    

    这段代码输出的HTML是:

    <h1 id="my-custom-hash">heading</h1>
    

    更多渲染器的API。

    设置一个简单规则示例

    如何在执行正则表达式之前需要递归检查某些条件,你可以使用 Marked.setBlockRule( regexp[, callback] ) 方法,将第一个参数设置为正则表达式,第二个参数是回调函数。结果返回 regexp.exec(string)callback(execArr)

    在正则表达式中开始符号使用 ^ 非常重要,无论如何你都应该这么做。

    import { Marked, escape } from '@ts-stack/markdown';
    
    /**
     * KaTeX 是一个简单易用的运行在web端的JavaScript库
     */
    import * as katex from 'katex';
    
    
    Marked.setBlockRule(/^@@@ *(\w+)\n([\s\S]+?)\n@@@/, function (execArr) {
    
      // 如果你需要 Renderer 的上下文,this.选项的话,这里建议不要使用箭头函数
    
      const channel = execArr[1];
      const content = execArr[2];
    
      switch(channel)
      {
        case 'youtube':
        {
          const id = escape(content);
          return `\n<iframe width="420" height="315" src="https://www.youtube.com/embed/${id}"></iframe>\n`;
        }
        case 'katex':
        {
          return katex.renderToString(escape(content));
        }
        default:
        {
          const msg = `[Error: a channel "${channel}" for an embedded code is not recognized]`;
          return '<div style="color: red">' + msg + '</div>';
        }
      }
    });
    
    const blockStr = `
    # Example usage with embed block code
    
    @@@ katex
    c = \\pm\\sqrt{a^2 + b^2}
    @@@
    
    @@@ youtube
    JgwnkM5WwWE
    @@@
    `;
    
    const html = Marked.parse(blockStr);
    
    console.log(html);
    

    API

    Marked的class和types的方法

    /**
     * 接受Markdown文本以HTML格式返回文本
     * 
     * @param src 需要编译的markdown源码字符串
     * 
     * @param options 一些选项,他们可以被替换,但是不能与默认选项合并
     * 如何你想合并,你可以通过 `Marked.setOptions()` 做,你也可以使用`Marked.setOptions`
     * 
     */
    static parse(src: string, options?: MarkedOptions): string;
    
    /**
     * 允许Markdown文本可以返回格式化的HTML对象文本,通过 `BlockLexer.parser()` 来解析
     * 
     * @param src 需要编译的markdown源码字符串
     * @param options 一些选项,他们可以被替换,但是不能与默认选项合并
     * 如何你想合并,你可以通过 `Marked.setOptions()` 做
     */
    static debug(src: string, options?: MarkedOptions): {result: string, tokens: Token[], links: Links};
    
    
    /**
     * 将设置选项和默认选项合并
     * 
     * @param options 散列选项.
     */
    static setOptions(options: MarkedOptions): this;
    
    
    interface Token
    {
      type: number | string;
      text?: string;
      lang?: string;
      depth?: number;
      header?: string[];
      align?: ('center' | 'left' | 'right')[];
      cells?: string[][];
      ordered?: boolean;
      pre?: boolean;
      escaped?: boolean;
      execArr?: RegExpExecArray;
      /**
       * 用于调试,标识生成的HTML文件中的行号
       */
      line?: number;
    }
    
    enum TokenType
    {
      space = 1
      ,text
      ,paragraph
      ,heading
      ,listStart
      ,listEnd
      ,looseItemStart
      ,looseItemEnd
      ,listItemStart
      ,listItemEnd
      ,blockquoteStart
      ,blockquoteEnd
      ,code
      ,table
      ,html
      ,hr
    }
    
    
    // 这个class也可以用作接口.
    class MarkedOptions
    {
      gfm?: boolean = true;
      tables?: boolean = true;
      breaks?: boolean = false;
      pedantic?: boolean = false;
      sanitize?: boolean = false;
      sanitizer?: (text: string) => string;
      mangle?: boolean = true;
      smartLists?: boolean = false;
      silent?: boolean = false;
    
      /**
       * @param code 需要高亮的代码片段.
       * @param lang 在代码块中指定的编码语言.
       */
      highlight?: (code: string, lang?: string) => string;
      langPrefix?: string = 'lang-';
      smartypants?: boolean = false;
      headerPrefix?: string = '';
      /**
       * 默认是实例化的渲染器即:`new Renderer()`
       */
      renderer?: Renderer;
      /**
       * 自关闭无效标签按照XHML要求处理 (&lt;br/&gt;, &lt;img/&gt;, etc.)
       * with a "/" as required by XHTML.
       */
      xhtml?: boolean = false;
      /**
       * 用于转义HTML实体的函数,默认情况下使用内部 helper
       */
      escape?: (html: string, encode?: boolean) => string = escape;
      /**
       * 用于返转义HTML实体的函数,默认情况下也使用内部 helper
       */
       unescape?: (html: string) => string = unescape;
       /**
       * 如果设置为 `false`,一行文本默认会生成一段
       * 
       * ```ts
       * // isNoP == false
       * Marked.parse('some text'); // returns '<p>some text</p>'
       * 
       * Marked.setOptions({isNoP: true});
       * 
       * Marked.parse('some text'); // returns 'some text'
       * ```
       */
      isNoP?: boolean;
      }
    

    Renderer的API

    //*** 块级渲染的方法 ***
    
    code(code: string, lang?: string, escaped?: boolean): string;
    
    blockquote(quote: string): string;
    
    html(html: string): string;
    
    heading(text: string, level: number, raw: string): string;
    
    hr(): string;
    
    list(body: string, ordered?: boolean): string;
    
    listitem(text: string): string;
    
    paragraph(text: string): string;
    
    table(header: string, body: string): string;
    
    tablerow(content: string): string;
    
    tablecell(content: string, flags: {header?: boolean, align?: 'center' | 'left' | 'right'}): string;
    
    //*** 内联级的渲染方法. ***
    
    strong(text: string): string;
    
    em(text: string): string;
    
    codespan(text: string): string;
    
    br(): string;
    
    del(text: string): string;
    
    link(href: string, title: string, text: string): string;
    
    image(href: string, title: string, text: string): string;
    
    text(text: string): string;
    
    

    使用

    基于node的 v8.9.x以上版本

    git clone https://github.com/ts-stack/markdown.git
    cd markdown
    npm install
    cd projects/markdown-tests
    npm install
    npm run compile
    npm run bench
    

    默认情况下,只需要安装一次测试套件。测试套件包括所有的 markdown 特性。它不迎合特性的方便(你可以自行做些扩展)。

    LibLib load, msLib init, msBench work, msTotal, msMemory usage, KB
    @ts-stack/markdown v1.0.0-beta.45484935 706marked v0.8.05786987 489markdown v0.5.02212813219 220remarkable v2.0.05213614312 408commonmark v0.29.119314817022 571markdown-it v10.0.024317620317 190showdown v1.8.64740841957 767

    bench选项设置

    -l, --length       Approximate string length in kilobytes. Default ~ 300 KB.
    -t, --times        Number of runs this bench. Default - 1 times.
    

    测试文件积累在一个文件中。例如你可以指定 -- 长度100kb,如果没有,它将被连接到下一个,并检查它的长度,以此类推。

    bench选项的使用示例

    为了让npm传递参数,需要通过指定 --

    npm run bench -- -l 500 -t 1
    

    贡献和许可协议

    如果您向该项目贡献代码,则您将隐式地允许您的代码在麻省理工学院许可证下分发。你也含蓄地验证了这一点所有代码都是你的原创作品。</legalese>

    许可证

    Copyright (c) 2011-2014, Christopher Jeffrey. (MIT License)

    Copyright (c) 2018-2020, Костя Третяк. (MIT License)

    See LICENSE for more info.


    起源地下载网 » 【译】@ts-stack/markdown 的 README.md

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元