html-to-md
Version:
A JS library for convert HTML<String> to markdown<String>, gzip 10kb
314 lines (294 loc) • 9.99 kB
JavaScript
import html2Md from '../../src/index'
describe('test special', () => {
it('test-1', () => {
let str = "<body"
expect(html2Md(str)).toBe("<body")
})
it('test-2', () => {
let str = "<html><body><i>abc<b>xxx</b></i></body></html>"
expect(html2Md(str)).toBe("*abc**xxx***")
})
it('test-3', () => {
let str = "<pre class=\"hljs language-md\"><code><span class=\"hljs-bullet\"> - </span>foo\n" +
"<span class=\"hljs-bullet\">\n" +
" - </span>bar\n" +
"<span class=\"hljs-bullet\"> - </span>baz\n" +
"</code></pre>"
expect(html2Md(str)).toBe('```md\n' +
' - foo\n' +
'\n' +
' - bar\n' +
' - baz\n' +
'```')
})
it('pre code and p', () => {
let str = '<ul>\n' +
'<li>\n' +
'<p><strong>Since version 1.4.0, showdown supports the markdown="1" attribute</strong>, but for older versions, this attribute is ignored. This means:</p>\n' +
'<pre><code> <div markdown="1">\n' +
' Markdown does *not* work in here.\n' +
' </div>\n' +
'</code></pre>\n' +
'</li>\n' +
'<li>\n' +
'<p>You can only nest square brackets in link titles to a depth of two levels:</p>\n' +
'<pre><code> [[fine]](http://www.github.com/)\n' +
' [[[broken]]](http://www.github.com/)\n' +
'</code></pre>\n' +
'<p>If you need more, you can escape them with backslashes.</p>\n' +
'</li>\n' +
'<li>\n' +
'<p>A list is <strong>single paragraph</strong> if it has only <strong>1 line-break separating items</strong> and it becomes <strong>multi paragraph if ANY of its items is separated by 2 line-breaks</strong>:</p>\n' +
'<pre class="hljs language-md"><code><span class="hljs-bullet"> - </span>foo\n' +
'<span class="hljs-bullet">\n' +
' - </span>bar\n' +
'<span class="hljs-bullet"> - </span>baz\n' +
'</code></pre>\n' +
'<p>becomes</p>\n' +
'<pre class="hljs language-html"><code><span class="hljs-tag"><<span class="hljs-name">ul</span>></span>\n' +
' <span class="hljs-tag"><<span class="hljs-name">li</span>></span><span class="hljs-tag"><<span class="hljs-name">p</span>></span>foo<span class="hljs-tag"></<span class="hljs-name">p</span>></span><span class="hljs-tag"></<span class="hljs-name">li</span>></span>\n' +
' <span class="hljs-tag"><<span class="hljs-name">li</span>></span><span class="hljs-tag"><<span class="hljs-name">p</span>></span>bar<span class="hljs-tag"></<span class="hljs-name">p</span>></span><span class="hljs-tag"></<span class="hljs-name">li</span>></span>\n' +
' <span class="hljs-tag"><<span class="hljs-name">li</span>></span><span class="hljs-tag"><<span class="hljs-name">p</span>></span>baz<span class="hljs-tag"></<span class="hljs-name">p</span>></span><span class="hljs-tag"></<span class="hljs-name">li</span>></span>\n' +
'<span class="hljs-tag"></<span class="hljs-name">ul</span>></span>\n' +
'</code></pre>\n' +
'</li>\n' +
'</ul>'
expect(html2Md(str)).toBe("* **Since version 1.4.0, showdown supports the markdown=\"1\" attribute**, but for older versions, this attribute is ignored. This means:\n" +
"\n" +
" ```\n" +
" <div markdown=\"1\">\n" +
" Markdown does *not* work in here.\n" +
" </div>\n" +
" ```\n" +
"\n" +
"* You can only nest square brackets in link titles to a depth of two levels:\n" +
"\n" +
" ```\n" +
" [[fine]](http://www.github.com/)\n" +
" [[[broken]]](http://www.github.com/)\n" +
" ```\n" +
"\n" +
" If you need more, you can escape them with backslashes.\n" +
"\n" +
"* A list is **single paragraph** if it has only **1 line-break separating items** and it becomes **multi paragraph if ANY of its items is separated by 2 line-breaks**:\n" +
"\n" +
" ```md\n" +
" - foo\n" +
"\n" +
" - bar\n" +
" - baz\n" +
" ```\n" +
"\n" +
" becomes\n" +
"\n" +
" ```html\n" +
" <ul>\n" +
" <li><p>foo</p></li>\n" +
" <li><p>bar</p></li>\n" +
" <li><p>baz</p></li>\n" +
" </ul>\n" +
" ```")
})
it('li child has p', () => {
let str = "<ul>\n" +
"<li>\n" +
"<p>rawgit CDN</p>\n" +
"<pre><code> https://cdn.rawgit.com/showdownjs/showdown/<version tag>/dist/showdown.min.js\n" +
"</code></pre>\n" +
"</li>\n" +
"<li>\n" +
"<p>cdnjs</p>\n" +
"<pre><code> https://cdnjs.cloudflare.com/ajax/libs/showdown/<version tag>/showdown.min.js\n" +
"</code></pre>\n" +
"</li>\n" +
"</ul>"
expect(html2Md(str)).toBe("* rawgit CDN\n" +
"\n" +
" ```\n" +
" https://cdn.rawgit.com/showdownjs/showdown/<version tag>/dist/showdown.min.js\n" +
" ```\n" +
"\n" +
"* cdnjs\n" +
"\n" +
" ```\n" +
" https://cdnjs.cloudflare.com/ajax/libs/showdown/<version tag>/showdown.min.js\n" +
" ```")
})
it(" ``` inside <code></code>, should be nest", () => {
let str = '<h3>Multiple lines</h3>\n' +
'<p>To create blocks of code you should indent it by four spaces.</p>\n' +
'<pre class="hljs language-md"><code><span class="hljs-code"> this is a piece</span>\n' +
'<span class="hljs-code"> of</span>\n' +
'<span class="hljs-code"> code</span>\n' +
'</code></pre>\n' +
'<p>If the options <strong><code>ghCodeBlocks</code></strong> is activated (which is by default), you can use triple backticks (```) to format text as its own distinct block.</p>\n' +
'<pre><code>Check out this neat program I wrote:\n' +
'\n' +
'```\n' +
'x = 0\n' +
'x = 2 + 2\n' +
'what is x\n' +
'```\n' +
'</code></pre>\n'
expect(html2Md(str)).toBe('### Multiple lines\n' +
'\n' +
'To create blocks of code you should indent it by four spaces.\n' +
'\n' +
'```md\n' +
' this is a piece\n' +
' of\n' +
' code\n' +
'```\n' +
'\n' +
'If the options **`ghCodeBlocks`** is activated (which is by default), you can use triple backticks (\\`\\`\\`) to format text as its own distinct block.\n' +
'\n' +
' Check out this neat program I wrote:\n' +
'\n' +
' ```\n' +
' x = 0\n' +
' x = 2 + 2\n' +
' what is x\n' +
' ```')
})
it('multi nest p', () => {
expect(html2Md('<ul>\n<li>\n<p>p-1</p>\n<p>p-2</p>\n</li>\n<li>\n<p>p-3</p>\n<p>p-4</p>\n</li>\n</ul>'))
.toBe("* p-1\n" +
"\n" +
" p-2\n" +
"\n" +
"* p-3\n" +
"\n" +
" p-4")
})
it(" ``` in complicate list", () => {
expect(html2Md('<ul>\n' +
'<li>a</li>\n' +
'<li>b\n' +
'<ul>\n' +
'<li>\n' +
'<p>code</p>\n' +
'<pre><code>```javascript\n' +
'function\n' +
'```\n' +
'</code></pre>\n' +
'</li>\n' +
'</ul>\n' +
'</li>\n' +
'<li>c</li>\n' +
'</ul>'))
.toBe("* a\n" +
"* b\n" +
" * code\n" +
"\n" +
" ```javascript\n" +
" function\n" +
" ```\n" +
"* c")
})
it(" ``` in blockquote", () => {
expect(html2Md('<blockquote>\n' +
'<p>sdfsdfsf</p>\n' +
'<blockquote>\n' +
'<p>sdfsf</p>\n' +
'<blockquote>\n' +
'<p><code>fsdf</code></p>\n' +
'<pre><code>```sdfsdfsdf```\n' +
'this is function</code></pre>\n' +
'</blockquote>\n' +
'</blockquote>\n' +
'</blockquote>'))
.toBe("> sdfsdfsf\n" +
">\n" +
">> sdfsf\n" +
">>\n" +
">>> `fsdf`\n" +
">>>\n" +
">>> ```sdfsdfsdf```\n" +
">>> this is function")
})
it(" ``` in list without <p>", () => {
expect(html2Md('<ul>\n' +
'<li>\n' +
'<pre><code>```\n' +
'var a=5\n' +
'```</code></pre>\n' +
'</li>\n' +
'</ul>\n'))
.toBe("* ```\n" +
" var a=5\n" +
" ```")
})
it(" multi nest code", () => {
expect(html2Md('<ul>\n' +
'<li>c\n' +
'<ul>\n' +
'<li>d\n' +
'<ul>\n' +
'<li>\n' +
'<pre class="hljs"><code>abc\n' +
'</code></pre>\n' +
'</li>\n' +
'</ul>\n' +
'</li>\n' +
'</ul>\n' +
'</li>\n' +
'</ul>'))
.toBe("* c\n" +
" * d\n" +
" * ```\n" +
" abc\n" +
" ```")
})
it(" multi nest code2", () => {
expect(html2Md('<ul>\n' +
'<li>c\n' +
'<ul>\n' +
'<li>d\n' +
'<ul>\n' +
'<li>\n' +
'<pre><code>```\n' +
'</code></pre>\n' +
'abc<pre class="hljs"><code></code></pre>\n' +
'</li>\n' +
'</ul>\n' +
'</li>\n' +
'</ul>\n' +
'</li>\n' +
'</ul>'))
.toBe("* c\n" +
" * d\n" +
" * ```\n" +
"\n" +
" abc\n" +
" ```\n" +
"\n" +
" ```")
})
it('nest hr',()=>{
expect(html2Md("<ol>\n" +
"<li>sdff\n" +
"<ol>\n" +
"<li>sdfsf</li>\n" +
"<li>\n" +
"<hr>\n" +
"<hr>\n" +
"</li>\n" +
"</ol>\n" +
"</li>\n" +
"</ol>\n")).toBe(
"1. sdff\n" +
" 1. sdfsf\n" +
" 2. ---\n" +
"\n" +
" ---")
})
it('slim hr',()=>{
expect(html2Md('<hr>\n\n\n\n\n\n\n' +
'<hr>\n\n\n\n\n\n\n' +
'<hr>\n\n\n\n\n\n\n')).toBe('---\n' +
'\n' +
'---\n' +
'\n' +
'---')
})
})