1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
|
import pre, div, button from require 'mmm.dom'
import languages from require 'mmm.highlighting'
class Editor
o = if MODE == 'CLIENT'
mkobj = window\eval "(function () { return {}; })"
(tbl) ->
with obj = mkobj!
for k,v in pairs(tbl)
obj[k] = v
EDITOR: true
new: (value, mode, @fileder, @key) =>
@node = div class: 'editor'
@saveBtn = with button 'save'
.disabled = true
.onclick = (_, e) -> @save e
@cm = window\CodeMirror @node, o {
:value
:mode
lineNumber: true
lineWrapping: true
autoRefresh: true
theme: 'hybrid'
}
@lastSave = @cm\getDoc!\changeGeneration true
@cm\on 'changes', (_, mirr) ->
doc = @cm\getDoc!
@saveBtn.disabled = doc\isClean @lastSave
window\clearTimeout @timeout if @timeout
@timeout = window\setTimeout (-> @change!), 300
change: =>
@timeout = nil
doc = @cm\getDoc!
if @lastPreview and doc\isClean @lastPreview
-- no changes since last event
return
@lastPreview = doc\changeGeneration!
value = doc\getValue!
@fileder.facets[@key] = value
BROWSER\refresh!
save: (e) =>
e\preventDefault!
doc = @cm\getDoc!
@fileder\set @key, doc\getValue!
@lastSave = doc\changeGeneration true
[[
editors: if MODE == 'CLIENT' then {
{
inp: 'text/([^ ]*).*'
out: 'mmm/dom'
cost: 0
transform: (value, fileder, key) =>
mode = @from\match @convert.inp
Editor value, mode, fileder, key
}
{
inp: 'URL.*'
out: 'mmm/dom'
cost: 0
transform: (value, fileder, key) =>
Editor value, nil, fileder, key
}
}
]]
-- syntax-highlighted code
{
{
inp: 'text/([^ ]*).*'
out: 'mmm/dom'
cost: 5
transform: (val) =>
lang = @from\match @convert.inp
pre languages[lang] val
}
}
|