@atlaskit/editor-core
Version:
A package contains Atlassian editor core functionality
304 lines • 12.7 kB
JavaScript
"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