summaryrefslogtreecommitdiff
path: root/node_modules/section-matter/index.js
diff options
context:
space:
mode:
authorShipwreckt <me@shipwreckt.co.uk>2025-10-31 20:02:14 +0000
committerShipwreckt <me@shipwreckt.co.uk>2025-10-31 20:02:14 +0000
commit7a52ddeba2a68388b544f529d2d92104420f77b0 (patch)
tree15ddd47457a2cb4a96060747437d36474e4f6b4e /node_modules/section-matter/index.js
parent53d6ae2b5568437afa5e4995580a3fb679b7b91b (diff)
Changed from static to 11ty!
Diffstat (limited to 'node_modules/section-matter/index.js')
-rw-r--r--node_modules/section-matter/index.js136
1 files changed, 136 insertions, 0 deletions
diff --git a/node_modules/section-matter/index.js b/node_modules/section-matter/index.js
new file mode 100644
index 0000000..2b4d21e
--- /dev/null
+++ b/node_modules/section-matter/index.js
@@ -0,0 +1,136 @@
+'use strict';
+
+var typeOf = require('kind-of');
+var extend = require('extend-shallow');
+
+/**
+ * Parse sections in `input` with the given `options`.
+ *
+ * ```js
+ * var sections = require('{%= name %}');
+ * var result = sections(input, options);
+ * // { content: 'Content before sections', sections: [] }
+ * ```
+ * @param {String|Buffer|Object} `input` If input is an object, it's `content` property must be a string or buffer.
+ * @param {Object} options
+ * @return {Object} Returns an object with a `content` string and an array of `sections` objects.
+ * @api public
+ */
+
+module.exports = function(input, options) {
+ if (typeof options === 'function') {
+ options = { parse: options };
+ }
+
+ var file = toObject(input);
+ var defaults = {section_delimiter: '---', parse: identity};
+ var opts = extend({}, defaults, options);
+ var delim = opts.section_delimiter;
+ var lines = file.content.split(/\r?\n/);
+ var sections = null;
+ var section = createSection();
+ var content = [];
+ var stack = [];
+
+ function initSections(val) {
+ file.content = val;
+ sections = [];
+ content = [];
+ }
+
+ function closeSection(val) {
+ if (stack.length) {
+ section.key = getKey(stack[0], delim);
+ section.content = val;
+ opts.parse(section, sections);
+ sections.push(section);
+ section = createSection();
+ content = [];
+ stack = [];
+ }
+ }
+
+ for (var i = 0; i < lines.length; i++) {
+ var line = lines[i];
+ var len = stack.length;
+ var ln = line.trim();
+
+ if (isDelimiter(ln, delim)) {
+ if (ln.length === 3 && i !== 0) {
+ if (len === 0 || len === 2) {
+ content.push(line);
+ continue;
+ }
+ stack.push(ln);
+ section.data = content.join('\n');
+ content = [];
+ continue;
+ }
+
+ if (sections === null) {
+ initSections(content.join('\n'));
+ }
+
+ if (len === 2) {
+ closeSection(content.join('\n'));
+ }
+
+ stack.push(ln);
+ continue;
+ }
+
+ content.push(line);
+ }
+
+ if (sections === null) {
+ initSections(content.join('\n'));
+ } else {
+ closeSection(content.join('\n'));
+ }
+
+ file.sections = sections;
+ return file;
+};
+
+function isDelimiter(line, delim) {
+ if (line.slice(0, delim.length) !== delim) {
+ return false;
+ }
+ if (line.charAt(delim.length + 1) === delim.slice(-1)) {
+ return false;
+ }
+ return true;
+}
+
+function toObject(input) {
+ if (typeOf(input) !== 'object') {
+ input = { content: input };
+ }
+
+ if (typeof input.content !== 'string' && !isBuffer(input.content)) {
+ throw new TypeError('expected a buffer or string');
+ }
+
+ input.content = input.content.toString();
+ input.sections = [];
+ return input;
+}
+
+function getKey(val, delim) {
+ return val ? val.slice(delim.length).trim() : '';
+}
+
+function createSection() {
+ return { key: '', data: '', content: '' };
+}
+
+function identity(val) {
+ return val;
+}
+
+function isBuffer(val) {
+ if (val && val.constructor && typeof val.constructor.isBuffer === 'function') {
+ return val.constructor.isBuffer(val);
+ }
+ return false;
+}