Use uploaded images in markdown preview
This commit is contained in:
@@ -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 ""
|
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
|
||||||
|
|
||||||
|
|||||||
@@ -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: ->
|
||||||
|
|||||||
Reference in New Issue
Block a user