Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'app/assets/javascripts/static_site_editor/services/parse_source_file.js')
-rw-r--r--app/assets/javascripts/static_site_editor/services/parse_source_file.js66
1 files changed, 21 insertions, 45 deletions
diff --git a/app/assets/javascripts/static_site_editor/services/parse_source_file.js b/app/assets/javascripts/static_site_editor/services/parse_source_file.js
index 126dfe81b90..640186ee1d0 100644
--- a/app/assets/javascripts/static_site_editor/services/parse_source_file.js
+++ b/app/assets/javascripts/static_site_editor/services/parse_source_file.js
@@ -1,64 +1,40 @@
-const parseSourceFile = raw => {
- const frontMatterRegex = /(^---$[\s\S]*?^---$)/m;
- const preGroupedRegex = /([\s\S]*?)(^---$[\s\S]*?^---$)(\s*)([\s\S]*)/m; // preFrontMatter, frontMatter, spacing, and content
- let initial;
- let editable;
-
- const hasFrontMatter = source => frontMatterRegex.test(source);
+import grayMatter from 'gray-matter';
- const buildPayload = (source, header, spacing, body) => {
- return { raw: source, header, spacing, body };
- };
+const parseSourceFile = raw => {
+ const remake = source => grayMatter(source, {});
- const parse = source => {
- if (hasFrontMatter(source)) {
- const match = source.match(preGroupedRegex);
- const [, preFrontMatter, frontMatter, spacing, content] = match;
- const header = preFrontMatter + frontMatter;
+ let editable = remake(raw);
- return buildPayload(source, header, spacing, content);
+ const syncContent = (newVal, isBody) => {
+ if (isBody) {
+ editable.content = newVal;
+ } else {
+ editable = remake(newVal);
}
-
- return buildPayload(source, '', '', source);
};
- const syncEditable = () => {
- /*
- We re-parse as markdown editing could have added non-body changes (preFrontMatter, frontMatter, or spacing).
- Re-parsing additionally gets us the desired body that was extracted from the potentially mutated editable.raw
- */
- editable = parse(editable.raw);
- };
+ const trimmedEditable = () => grayMatter.stringify(editable).trim();
- const syncBodyToRaw = () => {
- editable.raw = `${editable.header}${editable.spacing}${editable.body}`;
- };
-
- const sync = (newVal, isBodyToRaw) => {
- const editableKey = isBodyToRaw ? 'body' : 'raw';
- editable[editableKey] = newVal;
+ const content = (isBody = false) => (isBody ? editable.content.trim() : trimmedEditable()); // gray-matter internally adds an eof newline so we trim to bypass, open issue: https://github.com/jonschlinkert/gray-matter/issues/96
- if (isBodyToRaw) {
- syncBodyToRaw();
- }
-
- syncEditable();
- };
+ const matter = () => editable.data;
- const content = (isBody = false) => {
- const editableKey = isBody ? 'body' : 'raw';
- return editable[editableKey];
+ const syncMatter = settings => {
+ const source = grayMatter.stringify(editable.content, settings);
+ syncContent(source);
};
- const isModified = () => initial.raw !== editable.raw;
+ const isModified = () => trimmedEditable() !== raw;
- initial = parse(raw);
- editable = parse(raw);
+ const hasMatter = () => editable.matter.length > 0;
return {
+ matter,
+ syncMatter,
content,
+ syncContent,
isModified,
- sync,
+ hasMatter,
};
};