UNPKG

@atlaskit/editor-core

Version:

A package contains Atlassian editor core functionality

304 lines • 12.7 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var parse_cxhtml_1 = require("./parse-cxhtml"); var encode_cxhtml_1 = require("./encode-cxhtml"); var languageMap_1 = require("./languageMap"); function encode(node, schema) { var docType = document.implementation.createDocumentType('html', '-//W3C//DTD XHTML 1.0 Strict//EN', 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'); var doc = document.implementation.createDocument('http://www.w3.org/1999/xhtml', 'html', docType); return encode_cxhtml_1.default(encodeFragment(node.content)); function encodeNode(node) { if (node.isText) { return encodeText(node); } else if (node.type === schema.nodes.blockquote) { return encodeBlockquote(node); } else if (node.type === schema.nodes.bulletList) { return encodeBulletList(node); } else if (node.type === schema.nodes.heading) { return encodeHeading(node); } else if (node.type === schema.nodes.confluenceJiraIssue) { return encodeJiraIssue(node); } else if (node.type === schema.nodes.rule) { return encodeHorizontalRule(); } else if (node.type === schema.nodes.listItem) { return encodeListItem(node); } else if (node.type === schema.nodes.orderedList) { return encodeOrderedList(node); } else if (node.type === schema.nodes.paragraph) { return encodeParagraph(node); } else if (node.type === schema.nodes.hardBreak) { return encodeHardBreak(); } else if (node.type === schema.nodes.codeBlock) { return encodeCodeBlock(node); } else if (node.type === schema.nodes.panel) { return encodePanel(node); } else if (node.type === schema.nodes.mention) { return encodeMention(node); } else if (node.type === schema.nodes.confluenceUnsupportedBlock || node.type === schema.nodes.confluenceUnsupportedInline) { return encodeUnsupported(node); } else if (node.type === schema.nodes.mediaGroup) { return encodeMediaGroup(node); } else if (node.type === schema.nodes.media) { return encodeMedia(node); } else if (node.type === schema.nodes.table) { return encodeTable(node); } else { throw new Error("Unexpected node '" + node.type.name + "' for CXHTML encoding"); } } function encodeBlockquote(node) { var elem = doc.createElement('blockquote'); elem.appendChild(encodeFragment(node.content)); return elem; } function encodeFragment(fragment) { var documentFragment = doc.createDocumentFragment(); fragment.forEach(function (node) { var domNode = encodeNode(node); if (domNode) { documentFragment.appendChild(domNode); } }); return documentFragment; } function encodeHeading(node) { var elem = doc.createElement("h" + node.attrs.level); elem.appendChild(encodeFragment(node.content)); return elem; } function encodeParagraph(node) { var elem = doc.createElement('p'); elem.appendChild(encodeFragment(node.content)); return elem; } function encodeMediaGroup(node) { var elem = doc.createElement('p'); elem.appendChild(encodeFragment(node.content)); return elem; } function encodeMedia(node) { var elem = doc.createElementNS(encode_cxhtml_1.FAB_XMLNS, 'fab:media'); var attrs = node.attrs; elem.setAttribute('media-id', attrs.id); elem.setAttribute('media-type', attrs.type); elem.setAttribute('media-collection', attrs.collection); if (attrs.__fileName) { elem.setAttribute('file-name', attrs.__fileName); } if (attrs.__fileSize) { elem.setAttribute('file-size', "" + attrs.__fileSize); } if (attrs.__fileMimeType) { elem.setAttribute('file-mime-type', attrs.__fileMimeType); } return elem; } function encodeTable(node) { var elem = doc.createElement('table'); var tbody = doc.createElement('tbody'); node.descendants(function (rowNode) { var rowElement = doc.createElement('tr'); rowNode.descendants(function (colNode) { var cellElement = (colNode.type === schema.nodes.tableCell ? doc.createElement('td') : doc.createElement('th')); cellElement.appendChild(encodeFragment(colNode.content)); rowElement.appendChild(cellElement); return false; }); tbody.appendChild(rowElement); return false; }); elem.appendChild(tbody); elem.setAttribute('class', 'confluenceTable'); return elem; } function encodeText(node) { if (node.text) { var root = doc.createDocumentFragment(); var elem = root; for (var _i = 0, _a = node.marks; _i < _a.length; _i++) { var mark = _a[_i]; switch (mark.type) { case schema.marks.strong: elem = elem.appendChild(doc.createElement('strong')); break; case schema.marks.em: elem = elem.appendChild(doc.createElement('em')); break; case schema.marks.strike: elem = elem.appendChild(doc.createElement('s')); break; case schema.marks.underline: elem = elem.appendChild(doc.createElement('u')); break; case schema.marks.subsup: elem = elem.appendChild(doc.createElement(mark.attrs['type'])); break; case schema.marks.code: elem = elem.appendChild(doc.createElement('code')); break; case schema.marks.mentionQuery: break; case schema.marks.link: elem = elem.appendChild(encodeLink(node)); break; default: throw new Error("Unable to encode mark '" + mark.type.name + "'"); } } elem.textContent = node.text; return root; } else { return doc.createTextNode(''); } } function encodeHardBreak() { return doc.createElement('br'); } function encodeHorizontalRule() { return doc.createElement('hr'); } function encodeBulletList(node) { var elem = doc.createElement('ul'); elem.appendChild(encodeFragment(node.content)); return elem; } function encodeOrderedList(node) { var elem = doc.createElement('ol'); elem.appendChild(encodeFragment(node.content)); return elem; } function encodeListItem(node) { var elem = doc.createElement('li'); elem.appendChild(encodeFragment(node.content)); return elem; } function encodeLink(node) { var link = doc.createElement('a'); link.innerHTML = node.text || ''; var href = ''; if (node.marks) { node.marks.forEach(function (mark) { if (mark.type.name === 'link') { href = mark.attrs.href; } }); } link.href = href; return link; } function encodeCodeBlock(node) { var elem = createMacroElement('code'); if (node.attrs.language) { var langParam = doc.createElementNS(encode_cxhtml_1.AC_XMLNS, 'ac:parameter'); langParam.setAttributeNS(encode_cxhtml_1.AC_XMLNS, 'ac:name', 'language'); langParam.textContent = languageMap_1.mapCodeLanguage(node.attrs.language); elem.appendChild(langParam); } var plainTextBody = doc.createElementNS(encode_cxhtml_1.AC_XMLNS, 'ac:plain-text-body'); var fragment = doc.createDocumentFragment(); (node.textContent || '').split(/]]>/g).map(function (value, index, array) { var isFirst = index === 0; var isLast = index === array.length - 1; var prefix = isFirst ? '' : '>'; var suffix = isLast ? '' : ']]'; return doc.createCDATASection(prefix + value + suffix); }).forEach(function (cdata) { return fragment.appendChild(cdata); }); plainTextBody.appendChild(fragment); elem.appendChild(plainTextBody); return elem; } function encodePanel(node) { var elem = createMacroElement(node.attrs.panelType); var body = doc.createElementNS(encode_cxhtml_1.AC_XMLNS, 'ac:rich-text-body'); var fragment = doc.createDocumentFragment(); node.descendants(function (node, pos) { // there is at least one top-level paragraph node in the panel body // all text nodes will be handled by "encodeNode" if (node.isBlock) { // panel title if (node.type.name === 'heading' && pos === 0) { var title = doc.createElementNS(encode_cxhtml_1.AC_XMLNS, 'ac:parameter'); title.setAttributeNS(encode_cxhtml_1.AC_XMLNS, 'ac:name', 'title'); title.textContent = node.firstChild.textContent; elem.appendChild(title); } else { var domNode = encodeNode(node); if (domNode) { fragment.appendChild(domNode); } } } return false; }); body.appendChild(fragment); elem.appendChild(body); return elem; } function encodeMention(node) { var link = doc.createElementNS(encode_cxhtml_1.FAB_XMLNS, 'fab:link'); var mention = doc.createElementNS(encode_cxhtml_1.FAB_XMLNS, 'fab:mention'); mention.setAttribute('atlassian-id', node.attrs['id']); // NOTE: (ED-1736) We're stripping @ from beginning of mention text, due to Confluence compatibility issues. var cdata = doc.createCDATASection(node.attrs['text'].replace(/^@/, '')); mention.appendChild(cdata); link.appendChild(mention); return link; } function encodeUnsupported(node) { var domNode = parse_cxhtml_1.default(node.attrs.cxhtml || '').querySelector('body').firstChild; if (domNode) { return doc.importNode(domNode, true); } } function encodeJiraIssue(node) { // if this is an issue list, parse it as unsupported node // @see https://product-fabric.atlassian.net/browse/ED-1193?focusedCommentId=26672&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-26672 if (!node.attrs.issueKey) { return encodeUnsupported(node); } var elem = createMacroElement('jira'); elem.setAttributeNS(encode_cxhtml_1.AC_XMLNS, 'ac:macro-id', node.attrs.macroId); var serverParam = doc.createElementNS(encode_cxhtml_1.AC_XMLNS, 'ac:parameter'); serverParam.setAttributeNS(encode_cxhtml_1.AC_XMLNS, 'ac:name', 'server'); serverParam.textContent = node.attrs.server; elem.appendChild(serverParam); var serverIdParam = doc.createElementNS(encode_cxhtml_1.AC_XMLNS, 'ac:parameter'); serverIdParam.setAttributeNS(encode_cxhtml_1.AC_XMLNS, 'ac:name', 'serverId'); serverIdParam.textContent = node.attrs.serverId; elem.appendChild(serverIdParam); var keyParam = doc.createElementNS(encode_cxhtml_1.AC_XMLNS, 'ac:parameter'); keyParam.setAttributeNS(encode_cxhtml_1.AC_XMLNS, 'ac:name', 'key'); keyParam.textContent = node.attrs.issueKey; elem.appendChild(keyParam); return elem; } function createMacroElement(name) { var elem = doc.createElementNS(encode_cxhtml_1.AC_XMLNS, 'ac:structured-macro'); elem.setAttributeNS(encode_cxhtml_1.AC_XMLNS, 'ac:name', name); elem.setAttributeNS(encode_cxhtml_1.AC_XMLNS, 'ac:schema-version', '1'); return elem; } } exports.default = encode; //# sourceMappingURL=encode.js.map