summaryrefslogtreecommitdiffstats
path: root/$mmm/plugins/code/converts: text$moonscript -> table.moon
blob: 851efba332b760cdd19203830caacdc90cd2623c (plain)
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
  }
}