UNPKG

@condenast/flyway-schema-validator

Version:
73 lines (62 loc) 2.2 kB
const CopilotMarkdownSource = require('@condenast/atjson-source-copilot-markdown').default; const VersoSource = require('@condenast/atjson-source-verso').default; const CKEditorRenderer = require('@condenast/atjson-renderer-ckeditor').default; const CKEditorSourceHTML = require('@condenast/atjson-source-ckeditor-html').default; const Diff = require('diff'); function sentencesToLines(value) { return value.split(/(\S.+?[.!?])(?=\s+|$)/).join('\n'); } function annotationsToJson({ annotations, content }) { return `${JSON.stringify( annotations.map(annotation => { const { type, start, end, attributes } = annotation.toJSON(); return { type, start, end, content: content.slice(start, end), attributes }; }), null, 2 )}\n`; } function getDiff(lhsDoc, rhsDoc) { const canonicalLeftHandSideDoc = lhsDoc.canonical(); const canonicalRightHandSideDoc = rhsDoc.canonical(); const isContentEqual = canonicalLeftHandSideDoc.content === canonicalRightHandSideDoc.content; let content; if (!isContentEqual) { content = Diff.createPatch( 'content', sentencesToLines(canonicalLeftHandSideDoc.content), sentencesToLines(canonicalRightHandSideDoc.content), 'in', 'out' ); } const annotations = Diff.createPatch( 'annotations', annotationsToJson(canonicalLeftHandSideDoc), annotationsToJson(canonicalRightHandSideDoc), 'in', 'out', { context: 8 } ); return content ? `${content}\n${annotations}` : annotations; } function isCKEditorCompatible(markdown) { try { const mdVersoDoc = CopilotMarkdownSource.fromRaw(markdown).convertTo(VersoSource); const ckeditorData = CKEditorRenderer.render(mdVersoDoc); const ckVersoDoc = CKEditorSourceHTML.fromRaw(ckeditorData).convertTo(VersoSource); const result = mdVersoDoc.equals(ckVersoDoc); if (result) { return { result }; } const diff = getDiff(mdVersoDoc, ckVersoDoc); return { result, diff }; } catch (error) { // errors might be thrown if Unknown annotations are encountered in // the rendering process return { result: false, error }; } } module.exports = { isCKEditorCompatible };