Created
January 29, 2020 18:54
-
-
Save danielyaa5/f944ca7ea0fd9d8cd1868b13b18f0410 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const getTag = (text, [lastParsedTag, lastParsedText] = [null, null]) => { | |
if (text.length === 0) return null; | |
const listItem = text[0] === '-'; | |
if (listItem) return 'li'; | |
const hashes = text.match(/^#+/); | |
if (hashes) return `h${Math.min(6, hashes[0].length)}`; | |
if (lastParsedTag === 'p' || lastParsedTag === 'li') return 'continued'; | |
return 'p'; | |
}; | |
const clean = (text, tag) => { | |
if (tag && tag[0] === 'h') return text.substring(tag[1]).trim(); | |
return text.replace(/^-\s*/, ''); | |
} | |
const isContinuedTag = tag => tag.includes('continued-'); | |
const wrapHtml = body => `<html>\n<body>\n${body}</body>\n</html>`; | |
const toHtml = parsedLines => parsedLines.reduce((acc, [currTag, currText], i) => { | |
const [lastTag, lastText] = i > 0 ? parsedLines[i - 1] : [null, null]; | |
if (currTag === 'li' && lastTag !== 'li') { | |
acc += '<ul>\n' | |
} | |
if (currTag) { | |
acc += `<${currTag}>${clean(currText, currTag)}</${currTag}>\n`; | |
} | |
if (currTag === null && lastTag === 'li') { | |
acc += '</ul>\n' | |
} | |
return acc; | |
}, ''); | |
const parse = md => md.split('\n').reduce((acc, line, i, src) => { | |
const text = line.trim(); | |
const lastParsedLine = i > 0 ? acc[acc.length - 1] : [null, null]; | |
const [lastParsedTag, lastParsedText] = lastParsedLine; | |
const lineTag = getTag(text, lastParsedLine); | |
if (lineTag === 'continued') { | |
lastParsedLine[1] = `${lastParsedText} ${text}`; | |
} else if (lineTag === null && lastParsedTag !== null) { | |
acc.push([null, null]); | |
} else { | |
acc.push([lineTag, text]); | |
} | |
const isLastLine = i === src.length - 1; | |
if (isLastLine) return wrapHtml(toHtml(acc)); | |
return acc; | |
}, []); | |
const test = ` | |
# hello, This is Markdown Live Preview | |
## what is Markdown? | |
## usage | |
## markdown quick reference | |
# headers | |
- hey | |
- adofasdkfjadsjfasdklflsdajf | |
jfasdkflsajdfklsadjfasdf | |
- fasdfasd | |
hello im a paragraph | |
on mulitple lines | |
heres a new paragraph | |
`; | |
console.log(parse(test)); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment