mirror of
https://github.com/Foundry376/Mailspring.git
synced 2024-11-12 12:40:08 +08:00
93 lines
3 KiB
CoffeeScript
93 lines
3 KiB
CoffeeScript
|
{DraftStoreExtension} = require 'nylas-exports'
|
||
|
|
||
|
class TemplatesDraftStoreExtension extends DraftStoreExtension
|
||
|
|
||
|
@warningsForSending: (draft) ->
|
||
|
warnings = []
|
||
|
if draft.body.search(/<code[^>]*empty[^>]*>/i) > 0
|
||
|
warnings.push("with an empty template area")
|
||
|
warnings
|
||
|
|
||
|
@finalizeSessionBeforeSending: (session) ->
|
||
|
body = session.draft().body
|
||
|
clean = body.replace(/<\/?code[^>]*>/g, '')
|
||
|
if body != clean
|
||
|
session.changes.add(body: clean)
|
||
|
|
||
|
@onMouseUp: (editableNode, range, event) ->
|
||
|
parent = range.startContainer?.parentNode
|
||
|
parentCodeNode = null
|
||
|
|
||
|
while parent and parent isnt editableNode
|
||
|
if parent.classList?.contains('var') and parent.tagName is 'CODE'
|
||
|
parentCodeNode = parent
|
||
|
break
|
||
|
parent = parent.parentNode
|
||
|
|
||
|
isSinglePoint = range.startContainer is range.endContainer and range.startOffset is range.endOffset
|
||
|
|
||
|
if isSinglePoint and parentCodeNode
|
||
|
range.selectNode(parentCodeNode)
|
||
|
selection = document.getSelection()
|
||
|
selection.removeAllRanges()
|
||
|
selection.addRange(range)
|
||
|
|
||
|
@onTabDown: (editableNode, range, event) ->
|
||
|
if event.shiftKey
|
||
|
@onTabSelectNextVar(editableNode, range, event, -1)
|
||
|
else
|
||
|
@onTabSelectNextVar(editableNode, range, event, 1)
|
||
|
|
||
|
@onTabSelectNextVar: (editableNode, range, event, delta) ->
|
||
|
return unless range
|
||
|
|
||
|
# Try to find the node that the selection range is
|
||
|
# currently intersecting with (inside, or around)
|
||
|
parentCodeNode = null
|
||
|
nodes = editableNode.querySelectorAll('code.var')
|
||
|
for node in nodes
|
||
|
if range.intersectsNode(node)
|
||
|
parentCodeNode = node
|
||
|
|
||
|
if parentCodeNode
|
||
|
if range.startOffset is range.endOffset and parentCodeNode.classList.contains('empty')
|
||
|
# If the current node is empty and it's a single insertion point,
|
||
|
# select the current node rather than advancing to the next node
|
||
|
selectNode = parentCodeNode
|
||
|
else
|
||
|
# advance to the next code node
|
||
|
matches = editableNode.querySelectorAll('code.var')
|
||
|
matchIndex = -1
|
||
|
for match, idx in matches
|
||
|
if match is parentCodeNode
|
||
|
matchIndex = idx
|
||
|
break
|
||
|
if matchIndex != -1 and matchIndex + delta >= 0 and matchIndex + delta < matches.length
|
||
|
selectNode = matches[matchIndex+delta]
|
||
|
|
||
|
if selectNode
|
||
|
range.selectNode(selectNode)
|
||
|
selection = document.getSelection()
|
||
|
selection.removeAllRanges()
|
||
|
selection.addRange(range)
|
||
|
event.preventDefault()
|
||
|
event.stopPropagation()
|
||
|
|
||
|
@onInput: (editableNode, event) ->
|
||
|
selection = document.getSelection()
|
||
|
|
||
|
isWithinNode = (node) ->
|
||
|
test = selection.baseNode
|
||
|
while test isnt editableNode
|
||
|
return true if test is node
|
||
|
test = test.parentNode
|
||
|
return false
|
||
|
|
||
|
codeTags = editableNode.querySelectorAll('code.var.empty')
|
||
|
for codeTag in codeTags
|
||
|
if selection.containsNode(codeTag) or isWithinNode(codeTag)
|
||
|
codeTag.classList.remove('empty')
|
||
|
|
||
|
|
||
|
module.exports = TemplatesDraftStoreExtension
|