From b64259cb5a28e97eeb8a9f92baac9dd4aade51b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A1ssio=20Zen?= Date: Thu, 19 Jan 2017 12:09:18 -0200 Subject: [PATCH] Sort frontmatter according to the fields order in config file. Closes #215 --- src/backends/backend.js | 3 ++- src/formats/yaml-frontmatter.js | 4 ++-- src/formats/yaml.js | 18 ++++++++++++++++-- 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/src/backends/backend.js b/src/backends/backend.js index f7ed1674..b6fd24fe 100644 --- a/src/backends/backend.js +++ b/src/backends/backend.js @@ -202,7 +202,8 @@ class Backend { entryToRaw(collection, entry) { const format = resolveFormat(collection, entry); - return format && format.toFile(entry); + const fieldsOrder = collection.get('fields').map(f => f.get('name')).toArray(); + return format && format.toFile(entry, fieldsOrder); } } diff --git a/src/formats/yaml-frontmatter.js b/src/formats/yaml-frontmatter.js index 545cc56e..bba0a6fe 100644 --- a/src/formats/yaml-frontmatter.js +++ b/src/formats/yaml-frontmatter.js @@ -10,7 +10,7 @@ export default class YAMLFrontmatter { return obj; } - toFile(data) { + toFile(data, sortedKeys) { const meta = {}; let body = ''; let content = ''; @@ -23,7 +23,7 @@ export default class YAMLFrontmatter { } content += '---\n'; - content += new YAML().toFile(meta); + content += new YAML().toFile(meta, sortedKeys); content += '---\n\n'; content += body; return content; diff --git a/src/formats/yaml.js b/src/formats/yaml.js index bcd87af5..64b9f51c 100644 --- a/src/formats/yaml.js +++ b/src/formats/yaml.js @@ -35,12 +35,26 @@ const OutputSchema = new yaml.Schema({ explicit: yaml.DEFAULT_SAFE_SCHEMA.explicit, }); +const sortKeys = (sortedKeys = []) => (a, b) => { + const idxA = sortedKeys.indexOf(a); + const idxB = sortedKeys.indexOf(b); + if (idxA === -1 || idxB === -1) { + if (a > b) return 1; + if (a < b) return -1; + return 0; + } + + if (idxA > idxB) return 1; + if (idxA < idxB) return -1; + return 0; +}; + export default class YAML { fromFile(content) { return yaml.safeLoad(content); } - toFile(data) { - return yaml.safeDump(data, { schema: OutputSchema }); + toFile(data, sortedKeys = []) { + return yaml.safeDump(data, { schema: OutputSchema, sortKeys: sortKeys(sortedKeys) }); } }