This repository was archived by the owner on Dec 15, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 349
Expand file tree
/
Copy pathmain.coffee
More file actions
187 lines (147 loc) Β· 6.69 KB
/
main.coffee
File metadata and controls
187 lines (147 loc) Β· 6.69 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
fs = require 'fs-plus'
{CompositeDisposable} = require 'atom'
MarkdownPreviewView = null
renderer = null
isMarkdownPreviewView = (object) ->
MarkdownPreviewView ?= require './markdown-preview-view'
object instanceof MarkdownPreviewView
module.exports =
activate: ->
@disposables = new CompositeDisposable()
@commandSubscriptions = new CompositeDisposable()
@destroyedItems = new Set()
@disposables.add atom.config.observe 'markdown-preview.grammars', (grammars) =>
@commandSubscriptions.dispose()
@commandSubscriptions = new CompositeDisposable()
grammars ?= []
grammars = grammars.map (grammar) -> grammar.replace(/\./g, ' ')
for grammar in grammars
@commandSubscriptions.add atom.commands.add "atom-text-editor[data-grammar='#{grammar}']",
'markdown-preview:toggle': =>
@toggle()
'markdown-preview:copy-html':
displayName: 'Markdown Preview: Copy HTML'
didDispatch: => @copyHTML()
'markdown-preview:save-as-html':
displayName: 'Markdown Preview: Save as HTML'
didDispatch: => @saveAsHTML()
return # Do not return the results of the for loop
@disposables.add atom.commands.add 'atom-workspace',
'markdown-preview:toggle-break-on-single-newline': ->
keyPath = 'markdown-preview.breakOnSingleNewline'
atom.config.set(keyPath, not atom.config.get(keyPath))
'markdown-preview:toggle-github-style': ->
keyPath = 'markdown-preview.useGitHubStyle'
atom.config.set(keyPath, not atom.config.get(keyPath))
previewFile = @previewFile.bind(this)
for extension in ['markdown', 'md', 'mdown', 'mkd', 'mkdown', 'ron', 'txt']
@disposables.add atom.commands.add ".tree-view .file .name[data-name$=\\.#{extension}]",
'markdown-preview:preview-file', previewFile
@disposables.add atom.workspace.addOpener (uriToOpen) =>
[protocol, path] = uriToOpen.split('://')
return unless protocol is 'markdown-preview'
try
path = decodeURI(path)
catch
return
if path.startsWith 'editor/'
@createMarkdownPreviewView(editorId: path.substring(7))
else
@createMarkdownPreviewView(filePath: path)
@disposables.add atom.workspace.getCenter().onDidStopChangingActivePaneItem (item) =>
editor = atom.workspace.getActiveTextEditor()
return if @lastActiveEditor is editor
if atom.config.get('markdown-preview.automaticallyClosePreview') and @lastActiveEditor
# Do not close preview if we change focus from the editor to the preview itself
unless isMarkdownPreviewView(item) and item.editorId is @lastActiveEditor.id.toString()
@removePreviewForEditor(@lastActiveEditor)
@lastActiveEditor = editor
if editor? and atom.config.get('markdown-preview.automaticallyOpenPreview')
uri = @uriForEditor(editor)
return if atom.workspace.paneForURI(uri)? # Preview already exists
openPreview = true
@destroyedItems.forEach (destroyedItem) ->
return unless isMarkdownPreviewView(destroyedItem) and openPreview
# Do not open preview for a text editor whose preview we just closed
openPreview = false if destroyedItem.editorId is editor.id.toString()
@destroyedItems.clear()
return unless openPreview
grammars = atom.config.get('markdown-preview.automaticPreviewGrammars') ? []
return unless editor.getGrammar().scopeName in grammars
@addPreviewForEditor(editor, atom.workspace.paneForItem(item))
@disposables.add atom.workspace.getCenter().onDidDestroyPaneItem ({item}) =>
@destroyedItems.add(item) unless item is @lastRemovedPreview
if atom.config.get('markdown-preview.automaticallyClosePreview')
@removePreviewForEditor(item) if atom.workspace.isTextEditor(item)
deactivate: ->
@disposables.dispose()
@commandSubscriptions.dispose()
createMarkdownPreviewView: (state) ->
if state.editorId or fs.isFileSync(state.filePath)
MarkdownPreviewView ?= require './markdown-preview-view'
new MarkdownPreviewView(state)
toggle: ->
if isMarkdownPreviewView(atom.workspace.getActivePaneItem())
atom.workspace.destroyActivePaneItem()
return
editor = atom.workspace.getActiveTextEditor()
return unless editor?
grammars = atom.config.get('markdown-preview.grammars') ? []
return unless editor.getGrammar().scopeName in grammars
@addPreviewForEditor(editor) unless @removePreviewForEditor(editor)
uriForEditor: (editor) ->
"markdown-preview://editor/#{editor.id}"
removePreviewForEditor: (editor) ->
uri = @uriForEditor(editor)
previewPane = atom.workspace.paneForURI(uri)
if previewPane?
@lastRemovedPreview = previewPane.itemForURI(uri)
previewPane.destroyItem(@lastRemovedPreview)
true
else
false
addPreviewForEditor: (editor, previousActivePane) ->
uri = @uriForEditor(editor)
previousActivePane ?= atom.workspace.getActivePane()
options =
searchAllPanes: true
if atom.config.get('markdown-preview.openPreviewInSplitPane')
options.split = 'right'
atom.workspace.open(uri, options).then (markdownPreviewView) ->
if isMarkdownPreviewView(markdownPreviewView)
previousActivePane.activate()
previewFile: ({target}) ->
filePath = target.dataset.path
return unless filePath
for editor in atom.workspace.getTextEditors() when editor.getPath() is filePath
@addPreviewForEditor(editor)
return
atom.workspace.open "markdown-preview://#{encodeURI(filePath)}", searchAllPanes: true
copyHTML: ->
editor = atom.workspace.getActiveTextEditor()
return unless editor?
renderer ?= require './renderer'
text = editor.getSelectedText() or editor.getText()
renderer.toHTML text, editor.getPath(), editor.getGrammar(), (error, html) ->
if error
console.warn('Copying Markdown as HTML failed', error)
else
atom.clipboard.write(html)
saveAsHTML: ->
activePane = atom.workspace.getActivePaneItem()
if isMarkdownPreviewView(activePane)
activePane.saveAs()
return
editor = atom.workspace.getActiveTextEditor()
return unless editor?
grammars = atom.config.get('markdown-preview.grammars') ? []
return unless editor.getGrammar().scopeName in grammars
uri = @uriForEditor(editor)
markdownPreviewPane = atom.workspace.paneForURI(uri)
return unless markdownPreviewPane?
previousActivePane = atom.workspace.getActivePane()
markdownPreviewPane.activate()
activePane = atom.workspace.getActivePaneItem()
if isMarkdownPreviewView(activePane)
activePane.saveAs().then ->
previousActivePane.activate()