106 lines
3.1 KiB
CoffeeScript
106 lines
3.1 KiB
CoffeeScript
|
((w) ->
|
||
|
w.gl ?= {}
|
||
|
w.gl.text ?= {}
|
||
|
|
||
|
gl.text.randomString = -> Math.random().toString(36).substring(7)
|
||
|
|
||
|
gl.text.replaceRange = (s, start, end, substitute) ->
|
||
|
s.substring(0, start) + substitute + s.substring(end);
|
||
|
|
||
|
gl.text.selectedText = (text, textarea) ->
|
||
|
text.substring(textarea.selectionStart, textarea.selectionEnd)
|
||
|
|
||
|
gl.text.lineBefore = (text, textarea) ->
|
||
|
split = text.substring(0, textarea.selectionStart).trim().split('\n')
|
||
|
split[split.length - 1]
|
||
|
|
||
|
gl.text.lineAfter = (text, textarea) ->
|
||
|
text.substring(textarea.selectionEnd).trim().split('\n')[0]
|
||
|
|
||
|
gl.text.blockTagText = (text, textArea, blockTag, selected) ->
|
||
|
lineBefore = @lineBefore(text, textArea)
|
||
|
lineAfter = @lineAfter(text, textArea)
|
||
|
|
||
|
if lineBefore is blockTag and lineAfter is blockTag
|
||
|
# To remove the block tag we have to select the line before & after
|
||
|
if blockTag?
|
||
|
textArea.selectionStart = textArea.selectionStart - (blockTag.length + 1)
|
||
|
textArea.selectionEnd = textArea.selectionEnd + (blockTag.length + 1)
|
||
|
|
||
|
selected
|
||
|
else
|
||
|
"#{blockTag}\n#{selected}\n#{blockTag}"
|
||
|
|
||
|
gl.text.insertText = (textArea, text, tag, blockTag, selected, wrap) ->
|
||
|
selectedSplit = selected.split('\n')
|
||
|
startChar = if not wrap and textArea.selectionStart > 0 then '\n' else ''
|
||
|
|
||
|
if selectedSplit.length > 1 and (not wrap or blockTag?)
|
||
|
if blockTag?
|
||
|
insertText = @blockTagText(text, textArea, blockTag, selected)
|
||
|
else
|
||
|
insertText = selectedSplit.map((val) ->
|
||
|
if val.indexOf(tag) is 0
|
||
|
"#{val.replace(tag, '')}"
|
||
|
else
|
||
|
"#{tag}#{val}"
|
||
|
).join('\n')
|
||
|
else
|
||
|
insertText = "#{startChar}#{tag}#{selected}#{if wrap then tag else ' '}"
|
||
|
|
||
|
if document.queryCommandSupported('insertText')
|
||
|
inserted = document.execCommand 'insertText', false, insertText
|
||
|
|
||
|
unless inserted
|
||
|
try
|
||
|
document.execCommand("ms-beginUndoUnit")
|
||
|
|
||
|
textArea.value = @replaceRange(
|
||
|
text,
|
||
|
textArea.selectionStart,
|
||
|
textArea.selectionEnd,
|
||
|
insertText)
|
||
|
try
|
||
|
document.execCommand("ms-endUndoUnit")
|
||
|
|
||
|
@moveCursor(textArea, tag, wrap)
|
||
|
|
||
|
gl.text.moveCursor = (textArea, tag, wrapped) ->
|
||
|
return unless textArea.setSelectionRange
|
||
|
|
||
|
if textArea.selectionStart is textArea.selectionEnd
|
||
|
if wrapped
|
||
|
pos = textArea.selectionStart - tag.length
|
||
|
else
|
||
|
pos = textArea.selectionStart
|
||
|
|
||
|
textArea.setSelectionRange pos, pos
|
||
|
|
||
|
gl.text.updateText = (textArea, tag, blockTag, wrap) ->
|
||
|
$textArea = $(textArea)
|
||
|
oldVal = $textArea.val()
|
||
|
textArea = $textArea.get(0)
|
||
|
text = $textArea.val()
|
||
|
selected = @selectedText(text, textArea)
|
||
|
$textArea.focus()
|
||
|
|
||
|
@insertText(textArea, text, tag, blockTag, selected, wrap)
|
||
|
|
||
|
gl.text.init = (form) ->
|
||
|
self = @
|
||
|
$('.js-md', form)
|
||
|
.off 'click'
|
||
|
.on 'click', ->
|
||
|
$this = $(@)
|
||
|
self.updateText(
|
||
|
$this.closest('.md-area').find('textarea'),
|
||
|
$this.data('md-tag'),
|
||
|
$this.data('md-block'),
|
||
|
not $this.data('md-prepend')
|
||
|
)
|
||
|
|
||
|
gl.text.removeListeners = (form) ->
|
||
|
$('.js-md', form).off()
|
||
|
|
||
|
) window
|