Nodeにコンテンツのメンテナンスプログラムを書き込もうとしています。私は長い年月を経てきた古いRuby/Perl/Shellの手であり、これらの言語で同様に見える単純なコードをノードでは簡単に得ることはできません。NodeJS:idiomaticが必要です:dirのファイルを読み込み、連結し、変換し、書き込みします。
タスク:それらを変換し、(ls
順で)それらを読んで、すべての*.md
ファイルを検索し、ヘッダコメントとフッターのコメントでそれらを囲みます。これらのファイルには、組み立てられて変換されたときに分かりやすいHTML文書であるMarkdownがあります。ここでは、シェルの実装です:
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. -->
Rubyは...
#!/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)
同様に合理的である。しかし、私が行う方法を見つけ出すことはできませんこれは右の気分になっている方法でのノードで(
フィールズ・ウェイ間違った(™)同期インターフェイスである:右に感じる
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);
})
Aウェイしかし、私は(™)仕事を得ることができないということです:読み取り
- ビルド ストリーム彼らは変換マークダウンする
- パイプ
- オープン出力ストリームとそれに変換されたデータをリダイレクト
朗報があるストリームヘッダーコメントを上と下に配置する時が来るまで、このアプローチは機能します。それらはファイルシステムではなくコード内に存在するので、出力ストリームにストリーム変換、サン変換する別のファイルとして「追加」することはできません。ほとんどのアプローチは、ヘッダー、フッター、ストリームデータを生成します。
明らかに、pipe()
-workは非同期で動作し、フッタプリントは読み取り+変換作業が完了する前に起動します。私はひどい(そして壊れた)Promise
のチェーンを最終的には動作させなかった。
もう1つの方法は、ヘッダーとフッターをストリームに変換して(奇妙なように...)、出力ストリームにも同様に流れ込ませることです(本当に変わっているようです)。
私はここにいくつかの共通のイディオムがないか、実際にはであり、実際にはという単純な作業をこのノードで単純に実行するのは難しいですか?