mirror of
https://github.com/codex-team/editor.js
synced 2024-06-26 17:30:48 +02:00
c3ee7560f1
* cover restoring fixed * upd * fetch fixed in safari * updated * plugins * plugins ready * code improved * fixed bug with backspace * improved architecture * Versioning (#102) * start versioning * codex.version * eslint settings * versioning improved * cover restoring and fetch function fixed (#101) * cover restoring fixed * upd * fetch fixed in safari * updated * plugins * plugins ready * code improved * fixed bug with backspace * improved architecture * new sanitize method (#103) * new sanitize method Need to fix caret position * removed console logs * version updated * eslint style * caret position * big fixed on sanitize method * sanitize improved, using observers * sanitize: using html-janitor * fixes * last fixes, code improved after review * updated * new bundle * webpack config improved * upd * upd * upd * upd * clear from conflicts * upd * upd
174 lines
4.4 KiB
JavaScript
174 lines
4.4 KiB
JavaScript
/**
|
|
* Codex Editor Renderer Module
|
|
*
|
|
* @author Codex Team
|
|
* @version 1.0
|
|
*/
|
|
|
|
var renderer = (function(renderer) {
|
|
|
|
/**
|
|
* Asyncronously parses input JSON to redactor blocks
|
|
*/
|
|
renderer.makeBlocksFromData = function () {
|
|
|
|
/**
|
|
* If redactor is empty, add first paragraph to start writing
|
|
*/
|
|
if (!codex.state.blocks.items.length) {
|
|
|
|
codex.ui.addInitialBlock();
|
|
return;
|
|
|
|
}
|
|
|
|
Promise.resolve()
|
|
|
|
/** First, get JSON from state */
|
|
.then(function() {
|
|
return codex.state.blocks;
|
|
})
|
|
|
|
/** Then, start to iterate they */
|
|
.then(codex.renderer.appendBlocks)
|
|
|
|
/** Write log if something goes wrong */
|
|
.catch(function(error) {
|
|
codex.core.log('Error while parsing JSON: %o', 'error', error);
|
|
});
|
|
|
|
};
|
|
|
|
/**
|
|
* Parses JSON to blocks
|
|
* @param {object} data
|
|
* @return Primise -> nodeList
|
|
*/
|
|
renderer.appendBlocks = function (data) {
|
|
|
|
var blocks = data.items;
|
|
|
|
/**
|
|
* Sequence of one-by-one blocks appending
|
|
* Uses to save blocks order after async-handler
|
|
*/
|
|
var nodeSequence = Promise.resolve();
|
|
|
|
for (var index = 0; index < blocks.length ; index++ ) {
|
|
|
|
/** Add node to sequence at specified index */
|
|
codex.renderer.appendNodeAtIndex(nodeSequence, blocks, index);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
/**
|
|
* Append node at specified index
|
|
*/
|
|
renderer.appendNodeAtIndex = function (nodeSequence, blocks, index) {
|
|
|
|
/** We need to append node to sequence */
|
|
nodeSequence
|
|
|
|
/** first, get node async-aware */
|
|
.then(function() {
|
|
|
|
return codex.renderer.getNodeAsync(blocks , index);
|
|
|
|
})
|
|
|
|
/**
|
|
* second, compose editor-block from JSON object
|
|
*/
|
|
.then(codex.renderer.createBlockFromData)
|
|
|
|
/**
|
|
* now insert block to redactor
|
|
*/
|
|
.then(function(blockData){
|
|
|
|
/**
|
|
* blockData has 'block', 'type' and 'stretched' information
|
|
*/
|
|
codex.content.insertBlock(blockData);
|
|
|
|
/** Pass created block to next step */
|
|
return blockData.block;
|
|
|
|
})
|
|
|
|
/** Log if something wrong with node */
|
|
.catch(function(error) {
|
|
codex.core.log('Node skipped while parsing because %o', 'error', error);
|
|
});
|
|
|
|
};
|
|
|
|
/**
|
|
* Asynchronously returns block data from blocksList by index
|
|
* @return Promise to node
|
|
*/
|
|
renderer.getNodeAsync = function (blocksList, index) {
|
|
|
|
return Promise.resolve().then(function() {
|
|
|
|
return blocksList[index];
|
|
|
|
});
|
|
};
|
|
|
|
/**
|
|
* Creates editor block by JSON-data
|
|
*
|
|
* @uses render method of each plugin
|
|
*
|
|
* @param {object} blockData looks like
|
|
* { header : {
|
|
* text: '',
|
|
* type: 'H3', ...
|
|
* }
|
|
* }
|
|
* @return {object} with type and Element
|
|
*/
|
|
renderer.createBlockFromData = function (blockData) {
|
|
|
|
/** New parser */
|
|
var pluginName = blockData.type,
|
|
cover = blockData.cover;
|
|
|
|
/** Get first key of object that stores plugin name */
|
|
// for (var pluginName in blockData) break;
|
|
|
|
/** Check for plugin existance */
|
|
if (!codex.tools[pluginName]) {
|
|
throw Error(`Plugin «${pluginName}» not found`);
|
|
}
|
|
|
|
/** Check for plugin having render method */
|
|
if (typeof codex.tools[pluginName].render != 'function') {
|
|
|
|
throw Error(`Plugin «${pluginName}» must have «render» method`);
|
|
}
|
|
|
|
/** New Parser */
|
|
var block = codex.tools[pluginName].render(blockData.data);
|
|
|
|
/** is first-level block stretched */
|
|
var stretched = codex.tools[pluginName].isStretched || false;
|
|
|
|
/** Retrun type and block */
|
|
return {
|
|
type : pluginName,
|
|
block : block,
|
|
stretched : stretched,
|
|
cover : cover
|
|
};
|
|
|
|
};
|
|
|
|
return renderer;
|
|
|
|
})({});
|
|
|
|
module.exports = renderer; |