jquery-ace.coffee 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. window.jQueryAce =
  2. initialize: (element, options) ->
  3. klass = switch true
  4. when $(element).is('textarea')
  5. jQueryAce.TextareaEditor
  6. else
  7. jQueryAce.BaseEditor
  8. new klass element, options
  9. defaults:
  10. theme: null
  11. lang: null
  12. mode: null
  13. width: null
  14. height: null
  15. version: '1.0.3'
  16. require: ->
  17. switch true
  18. when typeof ace.require is 'function'
  19. ace.require.apply null, arguments
  20. when typeof window.require is 'function'
  21. window.require.apply null, arguments
  22. else
  23. throw "Can't find 'require' function"
  24. class jQueryAce.BaseEditor
  25. constructor: (element, options = {}) ->
  26. @element = $(element)
  27. @options = $.extend {}, jQueryAce.defaults, options
  28. create: ->
  29. @editor = new jQueryAce.AceDecorator(ace.edit @element)
  30. @update()
  31. update: (options) ->
  32. @options = $.extend {}, @options, options if options?
  33. @editor.theme @options.theme if @options.theme?
  34. lang = @options.lang || @options.mode
  35. @editor.lang lang if lang?
  36. destroy: ->
  37. @element.data 'ace', null
  38. @editor.destroy()
  39. @element.empty()
  40. class jQueryAce.TextareaEditor extends jQueryAce.BaseEditor
  41. show: ->
  42. @container?.show()
  43. @element.hide()
  44. hide: ->
  45. @container?.hide()
  46. @element.show()
  47. create: ->
  48. @container = @createAceContainer()
  49. @editor = new jQueryAce.AceDecorator(ace.edit @container.get 0)
  50. @update()
  51. @editor.value @element.val()
  52. @editor.ace.on 'change', (e) =>
  53. @element.val @editor.value()
  54. @show()
  55. destroy: ->
  56. super()
  57. @hide()
  58. @container.remove()
  59. createAceContainer: ->
  60. @buildAceContainer().insertAfter @element
  61. buildAceContainer: ->
  62. $('<div></div>').css
  63. display: 'none'
  64. position: 'relative'
  65. width: @options.width || @element.width()
  66. height: @options.height || @element.height()
  67. class jQueryAce.AceDecorator
  68. constructor: (@ace) ->
  69. theme: (themeName) ->
  70. @ace.setTheme "ace/theme/#{themeName}"
  71. lang: (modeName) ->
  72. klass = jQueryAce.require("ace/mode/#{modeName}").Mode
  73. @session().setMode new klass
  74. mode: (modeName) ->
  75. @lang modeName
  76. session: ->
  77. @ace.getSession()
  78. destroy: ->
  79. @ace.destroy()
  80. value: (text) ->
  81. if text?
  82. @ace.insert text
  83. else
  84. @ace.getValue()
  85. (($) ->
  86. $.ace = (element, options) ->
  87. $(element).ace options
  88. $.fn.ace = (options) ->
  89. @each ->
  90. editor = $(@).data 'ace'
  91. if editor?
  92. editor.update options
  93. else
  94. editor = jQueryAce.initialize @, options
  95. editor.create()
  96. $(@).data 'ace', editor
  97. )(jQuery)