The following code reads a file, splits its data, replaces some characters in the data, and then joins the data again (I added more details in the comments):
// read plain text file and make content available in data
fs.readFile(filename, 'utf8', function(err, data) {
if (err) throw err
// turn the data into an array
data = data.split('\n\n')
// make a clone of the array to be used in the if statements.
var tree = data.slice()
for (var i = 0; i < tree.length; ++i) {
// turn #s into heading tags if #s are present
if (tree[i].match(/^#/g)) {
data[i] = data[i]
.replace(/^#### (.*)/gm, '<h4>$1</h4>')
.replace(/^### (.*)/gm, '<h3>$1</h3>')
.replace(/^## (.*)/gm, '<h2>$1</h2>')
.replace(/^# (.*)/gm, '<h1>$1</h1>')
}
// smarten " or ' if present
if (tree[i].match(/"|'/g)) {
data[i] = data[i]
.replace(/"(?=\b|\*|')/g, '“')
.replace(/"(?!\b|\*|')/g, '”')
.replace(/'(?!\b|\*)|(?=\b)'(?=\b)/g, '’')
.replace(/'(?=\b|\*)/g, '‘')
}
// turn -- into — if present
if (tree[i].match(/--/g)) {
data[i] = data[i]
.replace(/\b--(\b)*/g, '—')
}
// turn * or ** into italics and bold if present
if (tree[i].match(/\*\*|\*/g)) {
data[i] = data[i]
.replace(/\*\*([^\*|\s]+)\*\*/g, '<strong>$1</strong>')
.replace(/\*([^\*|\s]+)\*/g, '<em>$1</em>')
}
// surround every element with p tags if the
// element doesn't start with an #. Also if the previous element of
// the element is # or * * * add the p tag with the class ni
if (tree[i].match(/^[^#]/g)) {
if (tree[i - 1] && (tree[i - 1].match(/^#/g) || tree[i - 1] === "* * *")) {
data[i] = '<p class="ni">' + data[i] + '</p>'
} else {
data[i] = '<p>' + data[i] + '</p>'
}
}
}
// lastly, put the array together again to the saved as HTML
data = data.join('\n\n')
saveHtml(data)
})
Example input:
# Title
'Single quotes'
"Double Quotes"
* * *
Paragraphs
Output:
<h1>Title</h1>
<p class="ni">‘Single quotes’</p>
<p>“Double Quotes”</p>
<p>* * *</p>
<p class="ni">Paragraphs
</p>
Is there a cleaner way to write those if statements? Or at least create a function so that there is less code in that fs.readFile
block?