From 622f80d153a673bde8f15a27f6b42cd21d35914f Mon Sep 17 00:00:00 2001 From: Andrew Miner Date: Mon, 8 Jun 2015 09:01:53 -0700 Subject: [PATCH] Use uploaded images in markdown preview --- .../markdown_image_controller.coffee | 30 ++++++++++++++----- .../markdown_image_list_controller.coffee | 6 ++++ .../markdown_section_controller.coffee | 10 +++++-- src/coffee/models/markdown_image.coffee | 9 +++++- src/coffee/models/markdown_image_list.coffee | 9 ++++++ 5 files changed, 53 insertions(+), 11 deletions(-) diff --git a/src/coffee/controllers/markdown_image_controller.coffee b/src/coffee/controllers/markdown_image_controller.coffee index fe81f1524..d70825dac 100644 --- a/src/coffee/controllers/markdown_image_controller.coffee +++ b/src/coffee/controllers/markdown_image_controller.coffee @@ -7,6 +7,7 @@ All rights reserved. _ = require 'underscore' BaseController = require './base_controller' +MarkdownImage = require '../models/markdown_image' ######################################################################################################################## @@ -23,20 +24,35 @@ module.exports = class MarkdownImageController extends BaseController @$input.click() onFileChanged: -> + if @_reader? then @_reader.abort = true + file = @$input.prop('files')[0] - @_reader = new FileReader - @_reader.onload = => - index = @_reader.result.indexOf ',' - meta = @_reader.result.substring 0, index - encodedData = @_reader.result.substring index + 1 + + reader = @_reader = new FileReader + reader.abort = false + reader.onload = => + 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:(.*);(.*)/ mimeType = match[1] 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 ##################################################################### diff --git a/src/coffee/controllers/markdown_image_list_controller.coffee b/src/coffee/controllers/markdown_image_list_controller.coffee index 4960cd8ca..cd19c3e9f 100644 --- a/src/coffee/controllers/markdown_image_list_controller.coffee +++ b/src/coffee/controllers/markdown_image_list_controller.coffee @@ -23,9 +23,15 @@ module.exports = class MarkdownImageListController extends BaseController # Public Methods ############################################################################### + getImageUrlForFile: (fileName)-> + @model.getImageUrlForFile fileName + loadImages: -> @model.loadImages() + reset: -> + @model.reset() + # Property Methods ############################################################################# getImageBase: -> diff --git a/src/coffee/controllers/markdown_section_controller.coffee b/src/coffee/controllers/markdown_section_controller.coffee index b670bdae8..1a8223ace 100644 --- a/src/coffee/controllers/markdown_section_controller.coffee +++ b/src/coffee/controllers/markdown_section_controller.coffee @@ -73,6 +73,9 @@ module.exports = class MarkdownSectionController extends BaseController @model = @_originalModel @resetToDefaultState() + @_imageListController.reset() + @_updatePreview() + onEditClicked: (event)-> event.preventDefault() return unless @editable @@ -89,6 +92,7 @@ module.exports = class MarkdownSectionController extends BaseController onPreviewClicked: (event)-> event.preventDefault() + @_updatePreview() @state = State.previewing onReturnClicked: (event)-> @@ -191,8 +195,8 @@ module.exports = class MarkdownSectionController extends BaseController # Private Methods ############################################################################## _convertImageLinks: (text)-> - text.replace /\!\[([^\]]*)\]\(([^\)]*)\)/g, (match, altText, fileName)=> - return "![#{altText}](#{@imageBase}/#{fileName})" + text.replace /\ + return " text.replace /\[\[([^\]]*)\]\]/g, (match, name)=> @@ -215,8 +219,8 @@ module.exports = class MarkdownSectionController extends BaseController text = @model if @model? text = @_convertWikiLinks text - text = @_convertImageLinks text text = convertMarkdown text + text = @_convertImageLinks text @$markdownPanel.html text diff --git a/src/coffee/models/markdown_image.coffee b/src/coffee/models/markdown_image.coffee index 8bb6c93fa..d92b902e3 100644 --- a/src/coffee/models/markdown_image.coffee +++ b/src/coffee/models/markdown_image.coffee @@ -26,7 +26,7 @@ module.exports = class MarkdownImage extends BaseModel 'empty': 'empty' 'creatable': 'creatable' 'unchanged': 'unchanged' - 'updateable': 'updatable' + 'updateable': 'updateable' } constructor: (attributes={}, options={})-> @@ -46,6 +46,12 @@ module.exports = class MarkdownImage extends BaseModel getFullPath: -> return "#{@path}/#{@fileName}" + getImageUrl: -> + if @mimeType? and @encodedData? + return "data:#{@mimeType};base64,#{@encodedData}" + else + return @fullPath + getMimeType: -> if not @_mimeType? for mimeType in MimeTypes @@ -57,6 +63,7 @@ module.exports = class MarkdownImage extends BaseModel Object.defineProperties @prototype, fullPath: {get:@prototype.getFullPath} + imageUrl: {get:@prototype.getImageUrl} mimeType: {get:@prototype.getMimeType} # BaseModel Overrides ########################################################################## diff --git a/src/coffee/models/markdown_image_list.coffee b/src/coffee/models/markdown_image_list.coffee index 913c842cb..9720ba758 100644 --- a/src/coffee/models/markdown_image_list.coffee +++ b/src/coffee/models/markdown_image_list.coffee @@ -30,11 +30,20 @@ module.exports = class MarkdownImageList extends BaseModel # Public Methods ############################################################################### + getImageUrlForFile: (fileName)-> + result = @_images[fileName]?.imageUrl + result ?= "#{@imageBase}/#{fileName}" + return result + loadImages: -> for fileName, image of @_images if image.status is MarkdownImage.Status.unknown image.fetch() + reset: -> + @_images = {} + @_analyzeMarkdownText() + # Property Methods ############################################################################# getAll: ->