But what is the real problem ? (getting editing and feedback in a simple way)<p>Textarea or contenteditable provide support for editing, but not for syntax highliting or fancy functions
- or to have them, the usual is to write all needed for editing from the ground - because it's not possible to control content of editable
in other way than by operating ranges of selection (like startOfsset and endOffset, regarding to startContainer and endContainer - and if they are equal, that's the cursor).<p>But it's very convinient to get both: contenteditable and syntax just by aligning precisely one over another, then get rid of few corner cases - as you can see below.<p>I made it once in Firefox 23+- in very minimal way.
I applied it by userContent.css with <i>@-moz-document regexp("^.*#?\\.(css|js|jsm)$") { .. }</i>,
it was working with <i>view-source:</i> as well, without making any changes to the original document
(half transparent anonymous content over it), very little was needed to keep it in sync
(or to have a handy feature to highligt same words as under cursor when Ctrl key is pressed) and.. you could just save the document after editing.<p><pre><code> @-moz-document regexp("^.\*#?\\.(css|js|jsm)$") {
html>body>pre { -moz-binding: url(hilite.xml#hilite) !important; }
div { position:absolute; pointer-events:none; }
div, pre, span{ white-space:pre !important; background:transparent; .. }
::-moz-selection { background: #d0e0d0 !important;}
}
</code></pre>
- - -<p><pre><code> <binding id="hilite" bindToUntrustedContent="true">
<content
><xht:div> </xht:div
><children /></content>
<implementation><constructor><![CDATA[
.. // "http://softwaremaniacs.org/soft/highlight/en/", version: 7.3.0 ..
this.sync =function(){
var t=this.replace(/<br>/g,'\n').replace(/&nbsp;/g,' ').replace(/&lt;/g,'<<>')
.replace(/&gt;/g,'<>>').replace(/&amp;/g,'<&>');
t=hilite(t, this.word).replace(/<<>/g,'<span><</span>')
.replace(/<>>/g,'<span>></span>').replace(/<&>/g,'<span>&</span>')
this.e0.innerHTML= t;
};
this.keydownt = function(e){ // filtering keycodes
if ((e.keyCode == 9)&&(!e.ctrlKey)){
document.execCommand('insertHTML',false,'\t'); e.preventDefault(); } .. } //tab
this.keydownf = function(e){
if(e.ctrlKey) getWord(); setTimeout(function() {sync();}, 0); .. }
setTimeout(function(){
document.body.setAttribute('spellcheck',"false"); this.contentEditable = true;
this.e0=document.getAnonymousNodes(this)[0];
this.textContent=this.innerHTML.replace(/&nbsp;/g,' ').replace(/&amp;/g,'&')
.replace(/&lt;/g,'<').replace(/&gt;/g,'>');
sync(); this.focus(); }, 0, false);
]]></constructor></implementation></binding></bindings>
</code></pre>
Orthogonally to that, I had userContent/Chrome.css opened in the sidebar and on every key up I unregister and loadAndRegisterSheet with it :) (the styles were applied live to documents or browser when the sidebar was open and saved on unload).