diff options
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.js | 66 |
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, }; }; |