preview.coffee 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. Spine = require('spine/core')
  2. $ = Spine.$
  3. Showdown = require('showdown')
  4. {_} = require("underscore")
  5. class PreviewUI extends Spine.Controller
  6. tag: 'div'
  7. className: 'ui-preview'
  8. filed: null
  9. live: true
  10. showClose: true
  11. autoOpen: true
  12. events:
  13. 'click .close-button': 'close'
  14. 'click .preview-button': 'render'
  15. constructor: ->
  16. super
  17. if @field
  18. @field = $(@field) if typeof @field is String
  19. @inner = $('<div class="inner" />')
  20. @el.append @inner
  21. @md = new Showdown.converter()
  22. @render()
  23. @setupLivePreview() if @live
  24. @setupPreviewButton() unless @live
  25. @setupCloseButton() if @showClose
  26. @open() if @autoOpen
  27. @
  28. render: (e) =>
  29. contentHtml = @md.makeHtml(@field.val())
  30. @inner.html contentHtml
  31. setupLivePreview: =>
  32. # Wait before firing the event constantly (a way to throttle)
  33. @lazyRender = _.debounce(@render, 800)
  34. @field.on 'keyup', @lazyRender
  35. setupCloseButton: ->
  36. @el.append $('<a class="close-button button small">X</a>')
  37. setupPreviewButton: ->
  38. @el.append $('<a class="preview-button button small">Render</a>')
  39. open: (e) =>
  40. e?.preventDefault()
  41. # Add to parent form
  42. @parentForm = @field.parents('form')
  43. @parentForm.append @el
  44. @parentForm.addClass('preview-mode')
  45. close: (e) =>
  46. e?.preventDefault()
  47. @parentForm.removeClass('preview-mode')
  48. @field.off 'keyup', @lazyRender
  49. @release()
  50. module.exports = PreviewUI