我正嘗試在Node中編寫內容manglement程序。我是一個老的Ruby/Perl/Shell手,多年以來,我似乎無法得到在這些語言中工作的簡單代碼,在Node中看起來類似,簡單。NodeJS:需要習慣用法:讀取dir中的文件,連接,轉換,編寫
任務:找到所有的*.md
文件,閱讀它們(在ls
順序),改造他們,並用頭註釋和頁腳註釋括號他們。這些文件按順序具有一些Markdown,它們在組裝和轉換時是合理的HTML文檔。這裏有一個shell執行:
echo '<!-- Generate at:' $(date) ' -->' $(ls *.md |xargs cat|markdown)'<!-- Copyright Mumble-demo Inc. -->'
產生所需的HTML:
<!-- Generate at: Tue Jun 6 08:25:59 EDT 2017 --> <h1>This is a Markdown File</h1> <h2>Heading 1</h2> <p>Inside of markdown we can create many interesting items</p> <ul> <li>such</li> <li>as</li> <li>lists</li> </ul><!-- Copyright Mumble-demo Inc. -->
紅寶石同樣是合理的......
#!/usr/bin/env ruby
require 'kramdown'
HEADER = "<!-- Generated at #{Time.now} -->\n"
FOOTER = "\n<!-- Copyright Mumble-demo Inc. -->"
OUTPUT = File.open("./output", "w")
results = Dir.glob("*.md").map { |f| File.open(f).readlines.join() }.reduce(:+)
OUTPUT.print(HEADER, Kramdown::Document.new(results).to_html, FOOTER)
但我想不出該怎麼辦這在節點中感覺良好的方式(TM)
那種感覺的方式錯誤(™)與同步接口:
const fs = require("fs")
const marked = require("marked")
const HEADER = `<!-- Generated at ${new Date()} -->\n`
const FOOTER = `\n<!-- Copyright Mumble-demo Inc. -->`
fs.readdir(".", (err, files) => {
if (err) throw err;
let markdownFiles = files.filter((f) => f.endsWith(".md"))
let content = markdownFiles.reduce((memo, fileName) => {
return memo + fs.readFileSync(fileName, 'utf8')
}, "")
let contentString = [HEADER, marked(content), FOOTER].reduce((m, i) => m + i, "")
fs.writeFileSync("derp", contentString);
console.log(contentString);
})
的方式,感覺不錯,但我不能去上班(™)是:
- 構建讀取流
- 管他們降價變換流
- 打開輸出流和重定向轉化數據,將其
好消息是 - 這種方法的作用,直到它把標題註釋放在頂部和底部。他們生活在代碼中,而不是文件系統中,所以我不能將它們「添加」爲另一個文件,以便將其轉換爲輸出流。大多數方法會產生:頁眉,頁腳,流式數據
顯然,pipe()
工作異步工作,頁腳打印在讀取+轉換工作完成之前觸發。我已經嘗試了可怕的(破碎的)Promise
鏈,最終沒有奏效。
一種替代方法是將頁眉和頁腳轉換爲流(看起來很奇怪......)並將它們流入輸出流(看起來很奇怪)。
我已經把這幾個經驗豐富的開發人員用這個......難道我們在這裏錯過了一些常見的成語或者它是其實這很難在Node中簡單地完成這個任務嗎?