Use uploaded images in markdown preview

This commit is contained in:
Andrew Miner
2015-06-08 09:01:53 -07:00
parent 6e82194ad8
commit 622f80d153
5 changed files with 53 additions and 11 deletions
@@ -7,6 +7,7 @@ All rights reserved.
_ = require 'underscore' _ = require 'underscore'
BaseController = require './base_controller' BaseController = require './base_controller'
MarkdownImage = require '../models/markdown_image'
######################################################################################################################## ########################################################################################################################
@@ -23,20 +24,35 @@ module.exports = class MarkdownImageController extends BaseController
@$input.click() @$input.click()
onFileChanged: -> onFileChanged: ->
if @_reader? then @_reader.abort = true
file = @$input.prop('files')[0] file = @$input.prop('files')[0]
@_reader = new FileReader
@_reader.onload = => reader = @_reader = new FileReader
index = @_reader.result.indexOf ',' reader.abort = false
meta = @_reader.result.substring 0, index reader.onload = =>
encodedData = @_reader.result.substring index + 1 if reader.abort
logger.info "aborted reading #{file.name}"
return
@_reader = null
index = reader.result.indexOf ','
meta = reader.result.substring 0, index
encodedData = reader.result.substring index + 1
match = meta.match /data:(.*);(.*)/ match = meta.match /data:(.*);(.*)/
mimeType = match[1] mimeType = match[1]
encoding = match[2] encoding = match[2]
logger.debug "uploaded #{encodedData.length} bytes as #{mimeType} in #{encoding}" @model.set
encodedData: encodedData
status: MarkdownImage.Status.updateable
@_reader.readAsDataURL file logger.info "loaded #{encodedData.length} bytes from #{file.name} as #{mimeType}"
logger.info "starting to read local file: #{file.name}"
reader.readAsDataURL file
# BaseController Overrides ##################################################################### # BaseController Overrides #####################################################################
@@ -23,9 +23,15 @@ module.exports = class MarkdownImageListController extends BaseController
# Public Methods ############################################################################### # Public Methods ###############################################################################
getImageUrlForFile: (fileName)->
@model.getImageUrlForFile fileName
loadImages: -> loadImages: ->
@model.loadImages() @model.loadImages()
reset: ->
@model.reset()
# Property Methods ############################################################################# # Property Methods #############################################################################
getImageBase: -> getImageBase: ->
@@ -73,6 +73,9 @@ module.exports = class MarkdownSectionController extends BaseController
@model = @_originalModel @model = @_originalModel
@resetToDefaultState() @resetToDefaultState()
@_imageListController.reset()
@_updatePreview()
onEditClicked: (event)-> onEditClicked: (event)->
event.preventDefault() event.preventDefault()
return unless @editable return unless @editable
@@ -89,6 +92,7 @@ module.exports = class MarkdownSectionController extends BaseController
onPreviewClicked: (event)-> onPreviewClicked: (event)->
event.preventDefault() event.preventDefault()
@_updatePreview()
@state = State.previewing @state = State.previewing
onReturnClicked: (event)-> onReturnClicked: (event)->
@@ -191,8 +195,8 @@ module.exports = class MarkdownSectionController extends BaseController
# Private Methods ############################################################################## # Private Methods ##############################################################################
_convertImageLinks: (text)-> _convertImageLinks: (text)->
text.replace /\!\[([^\]]*)\]\(([^\)]*)\)/g, (match, altText, fileName)=> text.replace /\<img src="([^"]*)"/g, (match, fileName)=>
return "![#{altText}](#{@imageBase}/#{fileName})" return "<img src=\"#{@_imageListController.getImageUrlForFile(fileName)}\""
_convertWikiLinks: (text)-> _convertWikiLinks: (text)->
text.replace /\[\[([^\]]*)\]\]/g, (match, name)=> text.replace /\[\[([^\]]*)\]\]/g, (match, name)=>
@@ -215,8 +219,8 @@ module.exports = class MarkdownSectionController extends BaseController
text = @model text = @model
if @model? if @model?
text = @_convertWikiLinks text text = @_convertWikiLinks text
text = @_convertImageLinks text
text = convertMarkdown text text = convertMarkdown text
text = @_convertImageLinks text
@$markdownPanel.html text @$markdownPanel.html text
+8 -1
View File
@@ -26,7 +26,7 @@ module.exports = class MarkdownImage extends BaseModel
'empty': 'empty' 'empty': 'empty'
'creatable': 'creatable' 'creatable': 'creatable'
'unchanged': 'unchanged' 'unchanged': 'unchanged'
'updateable': 'updatable' 'updateable': 'updateable'
} }
constructor: (attributes={}, options={})-> constructor: (attributes={}, options={})->
@@ -46,6 +46,12 @@ module.exports = class MarkdownImage extends BaseModel
getFullPath: -> getFullPath: ->
return "#{@path}/#{@fileName}" return "#{@path}/#{@fileName}"
getImageUrl: ->
if @mimeType? and @encodedData?
return "data:#{@mimeType};base64,#{@encodedData}"
else
return @fullPath
getMimeType: -> getMimeType: ->
if not @_mimeType? if not @_mimeType?
for mimeType in MimeTypes for mimeType in MimeTypes
@@ -57,6 +63,7 @@ module.exports = class MarkdownImage extends BaseModel
Object.defineProperties @prototype, Object.defineProperties @prototype,
fullPath: {get:@prototype.getFullPath} fullPath: {get:@prototype.getFullPath}
imageUrl: {get:@prototype.getImageUrl}
mimeType: {get:@prototype.getMimeType} mimeType: {get:@prototype.getMimeType}
# BaseModel Overrides ########################################################################## # BaseModel Overrides ##########################################################################
@@ -30,11 +30,20 @@ module.exports = class MarkdownImageList extends BaseModel
# Public Methods ############################################################################### # Public Methods ###############################################################################
getImageUrlForFile: (fileName)->
result = @_images[fileName]?.imageUrl
result ?= "#{@imageBase}/#{fileName}"
return result
loadImages: -> loadImages: ->
for fileName, image of @_images for fileName, image of @_images
if image.status is MarkdownImage.Status.unknown if image.status is MarkdownImage.Status.unknown
image.fetch() image.fetch()
reset: ->
@_images = {}
@_analyzeMarkdownText()
# Property Methods ############################################################################# # Property Methods #############################################################################
getAll: -> getAll: ->