@atlaskit/editor-core
Version:
A package contains Atlassian editor core functionality
75 lines • 2.8 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
var prosemirror_1 = require("../../prosemirror");
var getLanguageFromEditorStyle = function (dom) {
return dom.dataset['language'];
};
// example of BB style:
// <div class="codehilite language-javascript"><pre><span>hello world</span><span>\n</span></pre></div>
var getLanguageFromBitbucketStyle = function (dom) {
if (dom && dom.classList.contains('codehilite')) {
// code block html from Bitbucket always contains an extra new line
return extractLanguageFromClass(dom.className);
}
};
var extractLanguageFromClass = function (className) {
var languageRegex = /(?:^|\s)language-([^\s]+)/;
var result = languageRegex.exec(className);
if (result && result[1]) {
return result[1];
}
};
var removeLastNewLine = function (dom) {
var parent = dom && dom.parentElement;
if (parent && parent.classList.contains('codehilite')) {
dom.textContent = dom.textContent.replace(/\n$/, '');
}
return dom;
};
exports.codeBlock = {
attrs: { language: { default: null }, uniqueId: { default: null } },
content: 'text*',
group: 'block',
code: true,
defining: true,
parseDOM: [{
tag: 'pre',
preserveWhitespace: 'full',
getAttrs: function (dom) {
var language = (getLanguageFromBitbucketStyle(dom.parentElement) ||
getLanguageFromEditorStyle(dom.parentElement) ||
dom.getAttribute('data-language'));
dom = removeLastNewLine(dom);
return { language: language };
}
},
// Handle VSCode paste, it wraps copied content with
// <div style="...white-space: pre;...">
{
tag: 'div[style]',
preserveWhitespace: 'full',
getAttrs: function (dom) {
if (dom.style.whiteSpace === 'pre' || dom.style.whiteSpace === 'pre-wrap' ||
(dom.style.fontFamily && dom.style.fontFamily.toLowerCase().indexOf('monospace') > -1)) {
return {};
}
return false;
}
},
// Handle GitHub/Gist paste
{
tag: 'table[style]',
preserveWhitespace: 'full',
getAttrs: function (dom) {
if (dom.querySelector('td[class*="blob-code"]')) {
return {};
}
return false;
}
}],
toDOM: function (node) {
var className = prosemirror_1.browser.ie && prosemirror_1.browser.ie_version <= 11 ? 'ie11' : '';
return ['pre', { 'data-language': node.attrs.language, 'class': className }, 0];
}
};
//# sourceMappingURL=code-block.js.map