This commit is contained in:
Henry Jameson 2021-06-11 11:50:05 +03:00
parent f819227bed
commit 5834790d0b
2 changed files with 32 additions and 6 deletions

View File

@ -17,8 +17,9 @@
* @return {(string|{ text: string })[]} processed html in form of a list. * @return {(string|{ text: string })[]} processed html in form of a list.
*/ */
export const convertHtmlToLines = (html) => { export const convertHtmlToLines = (html) => {
const handledTags = new Set(['p', 'br', 'div']) const ignoredTags = new Set(['code', 'blockquote'])
const openCloseTags = new Set(['p', 'div']) const handledTags = new Set(['p', 'br', 'div', 'pre', 'code', 'blockquote'])
const openCloseTags = new Set(['p', 'div', 'pre', 'code', 'blockquote'])
let buffer = [] // Current output buffer let buffer = [] // Current output buffer
const level = [] // How deep we are in tags and which tags were there const level = [] // How deep we are in tags and which tags were there
@ -32,7 +33,7 @@ export const convertHtmlToLines = (html) => {
} }
const flush = () => { // Processes current line buffer, adds it to output buffer and clears line buffer const flush = () => { // Processes current line buffer, adds it to output buffer and clears line buffer
if (textBuffer.trim().length > 0) { if (textBuffer.trim().length > 0 && !level.some(l => ignoredTags.has(l))) {
buffer.push({ text: textBuffer }) buffer.push({ text: textBuffer })
} else { } else {
buffer.push(textBuffer) buffer.push(textBuffer)
@ -48,14 +49,14 @@ export const convertHtmlToLines = (html) => {
const handleOpen = (tag) => { // handles opening tags const handleOpen = (tag) => { // handles opening tags
flush() flush()
buffer.push(tag) buffer.push(tag)
level.push(tag) level.unshift(getTagName(tag))
} }
const handleClose = (tag) => { // handles closing tags const handleClose = (tag) => { // handles closing tags
flush() flush()
buffer.push(tag) buffer.push(tag)
if (level[level.length - 1] === tag) { if (level[0] === getTagName(tag)) {
level.pop() level.shift()
} }
} }

View File

@ -126,5 +126,30 @@ describe('TinyPostHTMLProcessor', () => {
const comparableResult = result.map(mapOnlyText(processorReplace)).join('') const comparableResult = result.map(mapOnlyText(processorReplace)).join('')
expect(comparableResult).to.eql(output) expect(comparableResult).to.eql(output)
}) })
it('Testing handling ignored blocks', () => {
const input = `
<pre><code>&gt; rei = &quot;0&quot;
&#39;0&#39;
&gt; rei == 0
true
&gt; rei == null
false</code></pre><blockquote>That, christian-like JS diagram but its evangelion instead.</blockquote>
`
const result = convertHtmlToLines(input)
const comparableResult = result.map(mapOnlyText(processorReplace)).join('')
expect(comparableResult).to.eql(input)
})
it('Testing handling ignored blocks 2', () => {
const input = `
<blockquote>An SSL error has happened.</blockquote><p>Shakespeare</p>
`
const output = `
<blockquote>An SSL error has happened.</blockquote><p>_</p>
`
const result = convertHtmlToLines(input)
const comparableResult = result.map(mapOnlyText(processorReplace)).join('')
expect(comparableResult).to.eql(output)
})
}) })
}) })