Anyone successfully implemented a CM6 editor as a custom Django widget? I’d like to use as a widget, similar to the many CM5 implementations I’ve seen around (django-mirror etc.). Can’t get a working solution as of yet. So any help would be appreciated.
widgets.py
class CodeMirrorEditor(forms.widgets.Widget):
template_name = "core/codemirror/widget.html"
def __init__(self, attrs=None, addons=[], **kwargs):
"""
Set the config options for the CodeMirror editor.
"""
self.config = CodeMirrorConfig()
self.config.update(**kwargs)
if addons:
self.config.set_addons(addons)
if not attrs:
attrs = {}
attrs['data-mirror'] = json.dumps(self.config.options)
super().__init__(attrs)
@property
def media(self):
"""
Dynamically define the css and js assets needed by the widget.
"""
media = forms.Media(
js=['codemirror/lang/all/cm.js']
)
media += forms.Media(js=['codemirror/init.js'])
return media
init.js
const djangoMirror = (function() {
'use strict';
// init a CodeMirror editor for the given <textarea>
const initMirror = function (textarea) {
let options = JSON.parse(textarea.dataset.mirror);
let view = new EditorView({doc: textarea.value, options})
textarea.parentNode.insertBefore(view.dom, textarea)
textarea.style.display = "none"
if (textarea.form) textarea.form.addEventListener("submit", () => {
textarea.value = view.state.doc.toString()
})
return view
};
document.addEventListener('DOMContentLoaded', () => {
document.querySelectorAll('textarea[data-mirror]').forEach(initMirror);
});
return {
initMirror: initMirror
};
})();
Generated cm.js by using rollup, with source js:
import * as CodeMirror from "codemirror"
import * as CodeMirrorAutocomplete from "@codemirror/autocomplete"
import * as CodeMirrorCommands from "@codemirror/commands"
import * as CodeMirrorIndentationMarkers from "@replit/codemirror-indentation-markers"
import * as CodeMirrorLanguage from "@codemirror/language"
import * as CodeMirrorLint from "@codemirror/lint"
import * as CodeMirrorSearch from "@codemirror/search"
import * as CodeMirrorState from "@codemirror/state"
import * as CodeMirrorView from "@codemirror/view"
e.g. node_modules/.bin/rollup input.js -f iife -o cm.js -p @rollup/plugin-node-resolve -p @rollup/plugin-commonjs