I have reached the point that I have to break up the ICE Code Editor. I have two different use cases for the editor and strewing conditionals throughout a monolithic codebase is getting old.
Much of the code is quite coupled, so I start by breaking the recent embedded code out into an API. My first pass will expose only an
ICE.attachEmbedded()
function that will find <script>
tags with the type
attribute set to "text/ice-code" and create a new ICE.Editor
instance associated with it. I am not wed to this API—this only seems a good starting place.In a new
ice-embedded.js
file, I start with a closure that will export ICE.attacheEmbedded()
(is that really a closure then?):(function(){ if (!window.ICE) ICE = {}; ICE.attachEmbedded = attachEmbedded; })();Most of the code that goes into
ICE>attachEmbedded()
is from my efforts over the past few days. I iterate over the <script>
tags to create new instances of the embedded ICE Editors:function attachEmbedded() { iceCodeScriptTags().forEach(function (script) { new Embedded(script); }); }Where the
Embedded
class mostly does the work of attaching a new ICE Editor instance and doing some prep work:function Embedded(script) { this.script = script; this.sourcecode = this.processSource(); this.el = this.createEmbeddedElement(); this.editor = new ICE.Editor(this.el); this.editor.setContent(this.sourcecode); }As for the editor itself, this is also newly extracted into a (different) class file. I define the constructor and export it:
(function(){ function Editor(el, options) { this.el = el; if (typeof(options) != "object") options = {}; this.edit_only = !!options.edit_only; this.preview_el = this.createPreviewElement(); this.editor_el = this.createEditorElement(); this.editor = this.initializeAce(); this.applyStyles(); } if (!window.ICE) ICE = {}; ICE.Editor = Editor; })();Again most of those methods are extracted from the monolithic codebase. The important thing is the
setContent()
method which is invoked by the Embeded
instance. I have that set the content of the editor and update the visualizations layer:Editor.prototype.setContent = function(data) { this.editor.setValue(data, -1); this.editor.getSession().setUndoManager(new UndoManager()); this.updatePreview(); }; Editor.prototype.updatePreview = function() { console.log('[updatePreview]'); };For now, the
updatePreview()
method is a tracer bullet. If all goes right, I should have my editor and hit that tracer bullet.I do not get either. At least not at first. It takes a bit of fiddling, but eventually I do get it. Mostly, I had not converted what were previously global variables into instance properties. Once I have that sorted out, I have my editor and my tracer bullets are hitting the mark:
It is not much, but it is a start. Hopefully tomorrow I can finish work on the embedded editors and get started on the full page editor with controls.
Day #713
No comments:
Post a Comment