UNPKG

@shelterzoom/draft-js-import-element

Version:
312 lines (286 loc) 10.8 kB
"use strict"; var _stateFromElement = _interopRequireDefault(require("../stateFromElement")); var _syntheticDom = require("synthetic-dom"); var _draftJs = require("draft-js"); var _fs = _interopRequireDefault(require("fs")); var _path = require("path"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; } function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; } function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { keys.push.apply(keys, Object.getOwnPropertySymbols(object)); } if (enumerableOnly) keys = keys.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(source, true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(source).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } var _global = global, describe = _global.describe, it = _global.it, expect = _global.expect; // This separates the test cases in `data/test-cases.txt`. var SEP = '\n\n#'; var testCasesRaw = _fs["default"].readFileSync((0, _path.join)(__dirname, '..', '..', 'test', 'test-cases.txt'), 'utf8'); var testCases = testCasesRaw.slice(1).trim().split(SEP).map(function (text) { var lines = text.split('\n'); var description = lines.shift().trim(); var state = removeBlockKeys(JSON.parse(lines[0])); var html = lines.slice(1).join('\n'); return { description: description, state: state, html: html }; }); describe('stateFromElement', function () { it('should create content state', function () { var textNode = new _syntheticDom.TextNode('Hello World'); var element = new _syntheticDom.ElementNode('div', [], [textNode]); var contentState = (0, _stateFromElement["default"])(element); var rawContentState = removeBlockKeys((0, _draftJs.convertToRaw)(contentState)); expect(rawContentState).toEqual({ entityMap: {}, blocks: [{ text: 'Hello World', type: 'unstyled', data: {}, depth: 0, inlineStyleRanges: [], entityRanges: [] }] }); }); it('should support option customBlockFn (type)', function () { var textNode = new _syntheticDom.TextNode('Hello World'); var element = new _syntheticDom.ElementNode('center', [], [textNode]); var options = { customBlockFn: function customBlockFn(element) { var tagName = element.tagName; if (tagName === 'CENTER') { return { type: 'center-align' }; } } }; var contentState = (0, _stateFromElement["default"])(element, options); var rawContentState = removeBlockKeys((0, _draftJs.convertToRaw)(contentState)); expect(rawContentState).toEqual({ entityMap: {}, blocks: [{ text: 'Hello World', type: 'center-align', data: {}, depth: 0, inlineStyleRanges: [], entityRanges: [] }] }); }); it('should support option customBlockFn (data)', function () { var textNode = new _syntheticDom.TextNode('Hello World'); var element = new _syntheticDom.ElementNode('p', [{ name: 'align', value: 'right' }], [textNode]); var options = { customBlockFn: function customBlockFn(element) { var tagName = element.tagName; if (tagName === 'P' && element.getAttribute('align') === 'right') { return { data: { textAlign: 'right' } }; } } }; var contentState = (0, _stateFromElement["default"])(element, options); var rawContentState = removeBlockKeys((0, _draftJs.convertToRaw)(contentState)); expect(rawContentState).toEqual({ entityMap: {}, blocks: [{ text: 'Hello World', type: 'unstyled', data: { textAlign: 'right' }, depth: 0, inlineStyleRanges: [], entityRanges: [] }] }); }); it('should support option customInlineFn', function () { var element = new _syntheticDom.ElementNode('div', [], [new _syntheticDom.ElementNode('span', [{ name: 'class', value: 'bold' }], [new _syntheticDom.TextNode('Hello')]), new _syntheticDom.ElementNode('span', [{ name: 'class', value: 'link' }], [new _syntheticDom.TextNode('World')])]); var options = { customInlineFn: function customInlineFn(el, _ref) { var Style = _ref.Style, Entity = _ref.Entity; if (el.tagName === 'SPAN' && el.className === 'bold') { return Style('BOLD'); } if (el.tagName === 'SPAN' && el.className === 'link') { return Entity('LINK', { url: '/abc' }); } } }; var contentState = (0, _stateFromElement["default"])(element, options); var rawContentState = removeBlockKeys((0, _draftJs.convertToRaw)(contentState)); expect(rawContentState).toEqual({ entityMap: _defineProperty({}, 0, { type: 'LINK', mutability: 'MUTABLE', data: { url: '/abc' } }), blocks: [{ text: 'HelloWorld', type: 'unstyled', depth: 0, inlineStyleRanges: [{ offset: 0, length: 5, style: 'BOLD' }], entityRanges: [{ offset: 5, length: 5, key: 0 }], data: {} }] }); }); it('should return multiple style from customInlineFn', function () { var element = new _syntheticDom.ElementNode('div', [], [new _syntheticDom.ElementNode('span', [{ style: 'font-family', value: 'sans-serif' }, { style: 'font-size', value: '12px' }], [new _syntheticDom.TextNode('Hello')])]); var options = { customInlineFn: function customInlineFn(el, _ref2) { var Style = _ref2.Style; if (el.tagName === 'SPAN') { return Style(['CUSTOM_STYLE_1', 'CUSTOM_STYLE_2']); } } }; var contentState = (0, _stateFromElement["default"])(element, options); var rawContentState = removeBlockKeys((0, _draftJs.convertToRaw)(contentState)); expect(rawContentState).toEqual({ entityMap: {}, blocks: [{ text: 'Hello', type: 'unstyled', depth: 0, inlineStyleRanges: [{ offset: 0, length: 5, style: 'CUSTOM_STYLE_1' }, { offset: 0, length: 5, style: 'CUSTOM_STYLE_2' }], entityRanges: [], data: {} }] }); }); it('should support option elementStyles', function () { var textNode = new _syntheticDom.TextNode('Superscript'); var element = new _syntheticDom.ElementNode('sup', [], [textNode]); var wrapperElement = new _syntheticDom.ElementNode('div', [], [element]); var options = { elementStyles: { sup: 'SUPERSCRIPT' } }; var contentState = (0, _stateFromElement["default"])(wrapperElement, options); var rawContentState = removeBlockKeys((0, _draftJs.convertToRaw)(contentState)); expect(rawContentState).toEqual({ entityMap: {}, blocks: [{ text: 'Superscript', type: 'unstyled', data: {}, depth: 0, inlineStyleRanges: [{ offset: 0, length: 11, style: 'SUPERSCRIPT' }], entityRanges: [] }] }); }); it('should support images', function () { var imageNode = new _syntheticDom.ElementNode('img', [{ name: 'src', value: 'imgur.com/asdf.jpg' }]); var wrapperElement = new _syntheticDom.ElementNode('div', [], [imageNode]); var contentState = (0, _stateFromElement["default"])(wrapperElement); var rawContentState = removeBlockKeys((0, _draftJs.convertToRaw)(contentState)); expect(rawContentState).toEqual({ blocks: [{ data: {}, depth: 0, entityRanges: [{ key: 0, length: 1, offset: 0 }], inlineStyleRanges: [], text: ' ', type: 'unstyled' }], entityMap: { // This is necessary due to flow not supporting non-string literal property keys // eslint-disable-next-line quote-props '0': { data: { src: 'imgur.com/asdf.jpg' }, mutability: 'MUTABLE', type: 'IMAGE' } } }); }); }); describe('stateFromHTML', function () { testCases.forEach(function (testCase) { var description = testCase.description, state = testCase.state, html = testCase.html; it("should render ".concat(description), function () { var element = parseHTML(html); var actualState = removeBlockKeys((0, _draftJs.convertToRaw)((0, _stateFromElement["default"])(element))); expect(actualState).toEqual(state); }); }); }); function parseHTML(html) { if (document.documentElement) { document.documentElement.innerHTML = html; } // This makes Flow happy return document.body || document.createElement('body'); } function removeBlockKeys(content) { var newContent = _objectSpread({}, content); newContent.blocks = content.blocks.map(function (block) { var key = block.key, other = _objectWithoutProperties(block, ["key"]); // eslint-disable-line no-unused-vars return other; }); return newContent; }