79 lines
2.2 KiB
CoffeeScript
79 lines
2.2 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.insertText = (textArea, text, tag, selected, wrap) ->
|
|
selectedSplit = selected.split('\n')
|
|
startChar = if not wrap and textArea.selectionStart > 0 then '\n' else ''
|
|
|
|
if selectedSplit.length > 1 and not wrap
|
|
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')
|
|
document.execCommand 'insertText', false, insertText
|
|
else
|
|
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, wrap) ->
|
|
$textArea = $(textArea)
|
|
oldVal = $textArea.val()
|
|
textArea = $textArea.get(0)
|
|
text = $textArea.val()
|
|
selected = @selectedText(text, textArea)
|
|
$textArea.focus()
|
|
|
|
@insertText(textArea, text, tag, 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'),
|
|
not $this.data('md-prepend')
|
|
)
|
|
|
|
gl.text.removeListeners = (form) ->
|
|
$('.js-md', form).off()
|
|
|
|
) window
|