Обработка разветвления на разных уровнях задач
Я действительно застрял на обработке разных уровней задач в Рамде. Я пытаюсь создать скрипт для анализа файлов LESS для комментариев и создания сайта библиотеки шаблонов на основе данных в комментариях и встроенного HTML-файла из примера. Это все работает (с большой помощью SO), кроме встраивания содержимого файла примера.
const target = path.join(__dirname, 'app/dist/templates/');
const source = path.join(__dirname, 'source/');
const stylesSource = path.join(__dirname, 'source/less/');
const template = path.join(__dirname, 'app/src/templates/page-template.html');
const writeTemplate = function(data) {
var rs = fs.createReadStream(template);
var ws = fs.createWriteStream(path.join(target, R.toLower(R.concat(data.name, ".html"))));
rs
.pipe(replaceStream("{{name}}", data.name))
.pipe(replaceStream("{{description}}", data.description))
.pipe(replaceStream("{{example}}", data.example))
.pipe(ws);
}
const inlineExample = function(data) {
return readFile(path.join(source, data.example));
}
// parseFile :: String -> { name :: String
// , description :: String
// , example :: String }
const parseFile = function parseFile(data) {
return {
name: R.trim(R.nth(1, R.match(/[$]name:(.*)/, data))),
description: R.trim(R.nth(1, R.match(/[$]description:(.*)/, data))),
example: R.trim(R.nth(1, R.match(/[$]example:(.*)/, data)))
};
};
// readDirectories :: String -> Task [String]
const readDirectories = function readDirectories(dir) {
return new Task(function (reject, resolve) {
glob(path.join(dir, "/**/*.less"), function (err, files) {
err == null ? resolve(files) : reject(err);
})
});
};
// readFile :: String -> Task String
const readFile = function readFile(filename) {
return new Task(function (reject, resolve) {
fs.readFile(path.normalize(filename), 'utf8', function (err, data) {
err == null ? resolve(data) : reject(err);
});
});
};
// dirs :: Task [String]
const dirs = readDirectories(stylesSource);
// files :: Task [Task String]
const files = R.map(R.map(readFile), dirs);
// commuted :: Task (Task [String])
const commuted = R.map(R.commute(Task.of), files);
// unnested :: Task [String]
const unnested = R.unnest(commuted);
// parsed :: Task [{ name :: String
// , description :: String
// , example :: String }]
const parsed = R.map(R.map(parseFile), unnested);
const inlined = R.map(R.chain(inlineExample), parsed);
inlined.fork(err => {
process.stderr.write(err.message);
},
data => {
R.map(writeTemplate, data);
util.log(R.concat('Library successfully generated at: ', target));
});
});
Я могу пройти, прочитать каталог, открыть файлы (возвращая новую задачу) и извлечь путь шаблона из комментариев. Затем я запускаю (я думаю) parseFile на пути (который возвращает задачу), и именно там он терпит неудачу. Я пытаюсь получить пример шаблона Task, чтобы я мог использовать его содержимое.
Я открыт для любых предложений, но подозреваю, что проблема где-то в R.map(writeTemplate, data)
в первоначальном успехе, но я немного не в себе.