mirror of
https://github.com/wassname/nvatom.git
synced 2026-09-10 12:21:11 +08:00
Compare commits
1
Commits
v0.9.2
..
feature-30
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ce9869362a |
@@ -1,6 +1,3 @@
|
|||||||
## 0.9.0
|
|
||||||
- Add an interlink feature
|
|
||||||
|
|
||||||
## 0.8.0
|
## 0.8.0
|
||||||
- Add a feature to delete an empty note automatically when closing its pane
|
- Add a feature to delete an empty note automatically when closing its pane
|
||||||
|
|
||||||
|
|||||||
@@ -13,7 +13,6 @@ This Atom package implements the some key features from this amazing app:
|
|||||||
- Modeless operation
|
- Modeless operation
|
||||||
- Mouseless interaction
|
- Mouseless interaction
|
||||||
- Incremental Search
|
- Incremental Search
|
||||||
- Interlinks
|
|
||||||
|
|
||||||
Integrated with Atom, we have several advantages:
|
Integrated with Atom, we have several advantages:
|
||||||
|
|
||||||
@@ -48,7 +47,6 @@ Double-quotes also work.
|
|||||||
## Key Bindings
|
## Key Bindings
|
||||||
|
|
||||||
- `alt-cmd-l`: Toggles the search view.
|
- `alt-cmd-l`: Toggles the search view.
|
||||||
- `alt-cmd-o`: Jumps to the referred note when the cursor is on the interlink in the form of [[double-bracketed interlink]].
|
|
||||||
|
|
||||||
You can also override `cmd-l` if you want to keep your muscle memory from Notational Velocity and nvALT. Just edit your keymap (Atom menu -> Open Your Keymap) and add the following lines:
|
You can also override `cmd-l` if you want to keep your muscle memory from Notational Velocity and nvALT. Just edit your keymap (Atom menu -> Open Your Keymap) and add the following lines:
|
||||||
|
|
||||||
|
|||||||
@@ -1,18 +0,0 @@
|
|||||||
'name': 'nvAtom Github Markdown'
|
|
||||||
'scopeName': 'source.gfm.nvatom'
|
|
||||||
'patterns': [
|
|
||||||
{
|
|
||||||
'include': 'source.gfm'
|
|
||||||
}
|
|
||||||
{
|
|
||||||
'match': '(?<!\\[)(\\[\\[)([^\\[\\]\|]+)(\\]\\])(?!\\])'
|
|
||||||
'name': 'interlink'
|
|
||||||
'captures':
|
|
||||||
'1':
|
|
||||||
'name': 'punctuation.definition.begin.gfm'
|
|
||||||
'2':
|
|
||||||
'name': 'markup.underline.link.interlink.gfm'
|
|
||||||
'3':
|
|
||||||
'name': 'punctuation.definition.begin.gfm'
|
|
||||||
}
|
|
||||||
]
|
|
||||||
@@ -9,5 +9,3 @@
|
|||||||
# https://atom.io/docs/latest/advanced/keymaps
|
# https://atom.io/docs/latest/advanced/keymaps
|
||||||
'atom-workspace':
|
'atom-workspace':
|
||||||
'alt-cmd-l': 'nvatom:toggle'
|
'alt-cmd-l': 'nvatom:toggle'
|
||||||
'atom-workspace atom-text-editor':
|
|
||||||
'alt-cmd-o': 'nvatom:openInterlink'
|
|
||||||
|
|||||||
@@ -1,48 +0,0 @@
|
|||||||
fs = require 'fs-plus'
|
|
||||||
path = require 'path'
|
|
||||||
{CompositeDisposable} = require 'atom'
|
|
||||||
Utility = require './utility'
|
|
||||||
|
|
||||||
module.exports =
|
|
||||||
class Interlink
|
|
||||||
constructor: ->
|
|
||||||
Interlink.loadGrammarSync()
|
|
||||||
@subscriptions = new CompositeDisposable
|
|
||||||
@subscriptions.add atom.commands.add 'atom-workspace', 'nvatom:openInterlink': => Interlink.openInterlink()
|
|
||||||
@subscriptions.add atom.workspace.observeTextEditors (editor) ->
|
|
||||||
if Utility.isNote(editor.getPath())
|
|
||||||
editor.setGrammar(atom.grammars.grammarForScopeName('source.gfm.nvatom'))
|
|
||||||
|
|
||||||
destroy: ->
|
|
||||||
@subscriptions.dispose()
|
|
||||||
|
|
||||||
@loadGrammarSync: ->
|
|
||||||
unless atom.grammars.grammarForScopeName('source.gfm.nvatom')
|
|
||||||
grammarPath = path.join(atom.packages.resolvePackagePath('nvatom'), 'grammars', 'nvatom.cson')
|
|
||||||
atom.grammars.loadGrammarSync(grammarPath)
|
|
||||||
|
|
||||||
@openInterlink: ->
|
|
||||||
editor = atom.workspace.getActiveTextEditor()
|
|
||||||
return unless editor?
|
|
||||||
return unless Utility.isNote(editor.getPath())
|
|
||||||
|
|
||||||
noteTitle = Interlink.getInterlinkUnderCursor(editor)
|
|
||||||
return unless noteTitle?
|
|
||||||
return unless noteTitle.length
|
|
||||||
|
|
||||||
notePath = Utility.getNotePath(noteTitle)
|
|
||||||
|
|
||||||
unless fs.existsSync(notePath)
|
|
||||||
fs.writeFileSync(notePath, '')
|
|
||||||
atom.workspace.open(notePath)
|
|
||||||
|
|
||||||
@getInterlinkUnderCursor: (editor) ->
|
|
||||||
cursorPosition = editor.getCursorBufferPosition()
|
|
||||||
token = editor.tokenForBufferPosition(cursorPosition)
|
|
||||||
return unless token
|
|
||||||
return unless token.value
|
|
||||||
return unless token.scopes.indexOf('markup.underline.link.interlink.gfm') > -1
|
|
||||||
|
|
||||||
interlink = Utility.trim(token.value)
|
|
||||||
return unless interlink.length
|
|
||||||
return interlink
|
|
||||||
@@ -3,15 +3,14 @@ fs = require 'fs-plus'
|
|||||||
_ = require 'underscore-plus'
|
_ = require 'underscore-plus'
|
||||||
{$, $$, SelectListView} = require 'atom-space-pen-views'
|
{$, $$, SelectListView} = require 'atom-space-pen-views'
|
||||||
DocQuery = require 'docquery'
|
DocQuery = require 'docquery'
|
||||||
Utility = require './utility'
|
|
||||||
|
|
||||||
module.exports =
|
module.exports =
|
||||||
class NotationalVelocityView extends SelectListView
|
class NotationalVelocityView extends SelectListView
|
||||||
initialize: (state) ->
|
initialize: (state) ->
|
||||||
@initializedAt = new Date()
|
@initializedAt = new Date()
|
||||||
super
|
super
|
||||||
@addClass('nvatom')
|
@addClass('nvatom from-top overlay')
|
||||||
@rootDirectory = Utility.getNoteDirectory()
|
@rootDirectory = atom.config.get('nvatom.directory')
|
||||||
unless fs.existsSync(@rootDirectory)
|
unless fs.existsSync(@rootDirectory)
|
||||||
throw new Error("The given directory #{@rootDirectory} does not exist. "
|
throw new Error("The given directory #{@rootDirectory} does not exist. "
|
||||||
+ "Set the note directory to the existing one from Settings.")
|
+ "Set the note directory to the existing one from Settings.")
|
||||||
@@ -39,33 +38,6 @@ class NotationalVelocityView extends SelectListView
|
|||||||
@prevCursorPosition = currCursorPosition
|
@prevCursorPosition = currCursorPosition
|
||||||
return isCursorProceeded
|
return isCursorProceeded
|
||||||
|
|
||||||
selectItem: (filteredItems, filterQuery) ->
|
|
||||||
isCursorProceeded = @isCursorProceeded()
|
|
||||||
|
|
||||||
for item in filteredItems
|
|
||||||
if item.title.toLowerCase() is filterQuery.toLowerCase()
|
|
||||||
# autoselect
|
|
||||||
n = filteredItems.indexOf(item) + 1
|
|
||||||
@selectItemView(@list.find("li:nth-child(#{n})"))
|
|
||||||
return
|
|
||||||
|
|
||||||
for item in filteredItems
|
|
||||||
if item.title.toLowerCase().startsWith(filterQuery.toLowerCase()) and isCursorProceeded
|
|
||||||
# autocomplete
|
|
||||||
@skipPopulateList = true
|
|
||||||
editor = @filterEditorView.model
|
|
||||||
editor.setText(filterQuery + item.title.slice(filterQuery.length))
|
|
||||||
editor.selectLeft(item.title.length - filterQuery.length)
|
|
||||||
|
|
||||||
# autoselect
|
|
||||||
n = filteredItems.indexOf(item) + 1
|
|
||||||
@selectItemView(@list.find("li:nth-child(#{n})"))
|
|
||||||
|
|
||||||
filter: (filterQuery) ->
|
|
||||||
if (filterQuery is "") or (filterQuery is undefined)
|
|
||||||
return @docQuery.documents
|
|
||||||
return @docQuery.search(filterQuery)
|
|
||||||
|
|
||||||
getFilterKey: ->
|
getFilterKey: ->
|
||||||
'filetext'
|
'filetext'
|
||||||
|
|
||||||
@@ -91,9 +63,10 @@ class NotationalVelocityView extends SelectListView
|
|||||||
|
|
||||||
confirmSelection: ->
|
confirmSelection: ->
|
||||||
item = @getSelectedItem()
|
item = @getSelectedItem()
|
||||||
sanitizedQuery = Utility.trim(@getFilterQuery())
|
|
||||||
calculatedPath = Utility.getNotePath(sanitizedQuery)
|
|
||||||
filePath = null
|
filePath = null
|
||||||
|
sanitizedQuery = @getFilterQuery().replace(/\s+$/, '')
|
||||||
|
extension = if atom.config.get('nvatom.extensions').length then atom.config.get('nvatom.extensions')[0] else '.md'
|
||||||
|
calculatedPath = path.join(@rootDirectory, sanitizedQuery + extension)
|
||||||
if item?
|
if item?
|
||||||
filePath = item.filePath
|
filePath = item.filePath
|
||||||
else if fs.existsSync(calculatedPath)
|
else if fs.existsSync(calculatedPath)
|
||||||
@@ -136,24 +109,73 @@ class NotationalVelocityView extends SelectListView
|
|||||||
selectedText = editor.getSelectedText()
|
selectedText = editor.getSelectedText()
|
||||||
return fullText.substring(0, fullText.length - selectedText.length)
|
return fullText.substring(0, fullText.length - selectedText.length)
|
||||||
|
|
||||||
|
filterByTitle: (filterQuery) ->
|
||||||
|
if (filterQuery is "") or (filterQuery is undefined)
|
||||||
|
return []
|
||||||
|
filterQuery = filterQuery.toLowerCase()
|
||||||
|
matchingNotes = []
|
||||||
|
filteredNotes = []
|
||||||
|
for note in @docQuery.documents
|
||||||
|
title = note.title.toLowerCase()
|
||||||
|
if title is filterQuery
|
||||||
|
matchingNotes.push(note)
|
||||||
|
else if filteredNotes.length < @maxItems and title.startsWith(filterQuery)
|
||||||
|
filteredNotes.push(note)
|
||||||
|
notes = matchingNotes.concat(filteredNotes)
|
||||||
|
if notes.length > @maxItems
|
||||||
|
notes = notes.slice(0, @maxItems)
|
||||||
|
return notes
|
||||||
|
|
||||||
|
filterByLunr: (filterQuery) ->
|
||||||
|
notes = []
|
||||||
|
if (filterQuery is "") or (filterQuery is undefined)
|
||||||
|
notes = @docQuery.documents
|
||||||
|
else
|
||||||
|
notes = @docQuery.search(filterQuery)
|
||||||
|
if notes.length > @maxItems
|
||||||
|
notes = notes.slice(0, @maxItems)
|
||||||
|
return notes
|
||||||
|
|
||||||
populateList: ->
|
populateList: ->
|
||||||
filterQuery = @getFilterQuery()
|
filterQuery = @getFilterQuery()
|
||||||
filteredItems = @filter(filterQuery)
|
notesByTitle = @filterByTitle(filterQuery)
|
||||||
|
notesByLunr = @filterByLunr(filterQuery)
|
||||||
|
isCursorProceeded = @isCursorProceeded()
|
||||||
|
|
||||||
@list.empty()
|
@list.empty()
|
||||||
if filteredItems.length
|
if notesByTitle.length + notesByLunr.length == 0
|
||||||
@setError(null)
|
@setError(@getEmptyMessage(@docQuery.documents.length, 0))
|
||||||
|
return
|
||||||
|
|
||||||
for i in [0...Math.min(filteredItems.length, @maxItems)]
|
@setError(null)
|
||||||
item = filteredItems[i]
|
for note in notesByTitle
|
||||||
itemView = $(@viewForItem(item))
|
itemView = $(@viewForItem(note))
|
||||||
itemView.data('select-list-item', item)
|
itemView.data('select-list-item', note)
|
||||||
@list.append(itemView)
|
@list.append(itemView)
|
||||||
|
|
||||||
@selectItem(filteredItems, filterQuery)
|
if notesByTitle.length
|
||||||
|
# autoselect
|
||||||
|
@selectItemView(@list.find("li:nth-child(1)"))
|
||||||
|
|
||||||
else
|
#autocomplete
|
||||||
@setError(@getEmptyMessage(@docQuery.documents.length, filteredItems.length))
|
note = notesByTitle[0]
|
||||||
|
if note.title.toLowerCase() is filterQuery.toLowerCase() or isCursorProceeded
|
||||||
|
@skipPopulateList = true
|
||||||
|
editor = @filterEditorView.model
|
||||||
|
editor.setText(filterQuery + note.title.slice(filterQuery.length))
|
||||||
|
editor.selectLeft(note.title.length - filterQuery.length)
|
||||||
|
|
||||||
|
if @list.length >= @maxItems
|
||||||
|
return
|
||||||
|
|
||||||
|
for note in notesByLunr
|
||||||
|
if @list.length >= @maxItems
|
||||||
|
break
|
||||||
|
if filterQuery?.length and note.title.toLowerCase().startsWith(filterQuery.toLowerCase())
|
||||||
|
continue
|
||||||
|
itemView = $(@viewForItem(note))
|
||||||
|
itemView.data('select-list-item', note)
|
||||||
|
@list.append(itemView)
|
||||||
|
|
||||||
schedulePopulateList: ->
|
schedulePopulateList: ->
|
||||||
unless @skipPopulateList
|
unless @skipPopulateList
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
path = require 'path'
|
path = require 'path'
|
||||||
fs = require 'fs-plus'
|
fs = require 'fs-plus'
|
||||||
{CompositeDisposable, Disposable} = require 'atom'
|
{CompositeDisposable, Disposable} = require 'atom'
|
||||||
Interlink = require './interlink'
|
|
||||||
Utility = require './utility'
|
|
||||||
|
|
||||||
module.exports =
|
module.exports =
|
||||||
config:
|
config:
|
||||||
@@ -24,12 +22,16 @@ module.exports =
|
|||||||
type: 'boolean'
|
type: 'boolean'
|
||||||
default: true
|
default: true
|
||||||
|
|
||||||
|
notationalVelocityView: null
|
||||||
|
|
||||||
activate: (state) ->
|
activate: (state) ->
|
||||||
@rootDirectory = @ensureNoteDirectory()
|
@rootDirectory = @ensureNoteDirectory()
|
||||||
|
|
||||||
|
# Events subscribed to in atom's system can be easily cleaned up with a
|
||||||
|
# CompositeDisposable
|
||||||
@subscriptions = new CompositeDisposable
|
@subscriptions = new CompositeDisposable
|
||||||
|
|
||||||
|
# Register command that toggles this view
|
||||||
@subscriptions.add atom.commands.add 'atom-workspace',
|
@subscriptions.add atom.commands.add 'atom-workspace',
|
||||||
'nvatom:toggle': => @createView(state).toggle()
|
'nvatom:toggle': => @createView(state).toggle()
|
||||||
|
|
||||||
@@ -47,15 +49,12 @@ module.exports =
|
|||||||
|
|
||||||
@subscriptions.add atom.workspace.onWillDestroyPaneItem ({item}) => @autosave(item) unless @autodelete(item)
|
@subscriptions.add atom.workspace.onWillDestroyPaneItem ({item}) => @autosave(item) unless @autodelete(item)
|
||||||
|
|
||||||
@interlink = new Interlink()
|
|
||||||
|
|
||||||
deactivate: ->
|
deactivate: ->
|
||||||
@subscriptions.dispose()
|
@subscriptions.dispose()
|
||||||
@interlnk?.destroy()
|
@notationalVelocityView.destroy()
|
||||||
@notationalVelocityView?.destroy()
|
|
||||||
|
|
||||||
serialize: ->
|
serialize: ->
|
||||||
notationalVelocityViewState: @notationalVelocityView?.serialize()
|
notationalVelocityViewState: @notationalVelocityView.serialize()
|
||||||
|
|
||||||
createView: (state, docQuery) ->
|
createView: (state, docQuery) ->
|
||||||
unless @notationalVelocityView?
|
unless @notationalVelocityView?
|
||||||
@@ -67,14 +66,16 @@ module.exports =
|
|||||||
return unless paneItem?.getURI?()?
|
return unless paneItem?.getURI?()?
|
||||||
return unless paneItem?.isModified?()
|
return unless paneItem?.isModified?()
|
||||||
uri = paneItem.getURI()
|
uri = paneItem.getURI()
|
||||||
return unless Utility.isNote(uri)
|
return unless uri.indexOf(@rootDirectory) is 0
|
||||||
|
return unless path.extname(uri) in atom.config.get('nvatom.extensions')
|
||||||
paneItem?.save?()
|
paneItem?.save?()
|
||||||
|
|
||||||
autodelete: (paneItem) ->
|
autodelete: (paneItem) ->
|
||||||
return false unless paneItem?.getURI?()?
|
return false unless paneItem?.getURI?()?
|
||||||
uri = paneItem.getURI()
|
uri = paneItem.getURI()
|
||||||
return false unless Utility.isNote(uri)
|
return false unless uri.indexOf(@rootDirectory) is 0
|
||||||
return false unless paneItem.isEmpty()
|
return false unless path.extname(uri) in atom.config.get('nvatom.extensions')
|
||||||
|
return false unless paneItem?.isEmpty()
|
||||||
fs.unlinkSync(uri)
|
fs.unlinkSync(uri)
|
||||||
noteName = uri.substring(@rootDirectory.length + 1)
|
noteName = uri.substring(@rootDirectory.length + 1)
|
||||||
atom.notifications.addInfo("Empty note #{noteName} is deleted.")
|
atom.notifications.addInfo("Empty note #{noteName} is deleted.")
|
||||||
@@ -84,7 +85,7 @@ module.exports =
|
|||||||
@autosave(paneItem) for paneItem in atom.workspace.getPaneItems()
|
@autosave(paneItem) for paneItem in atom.workspace.getPaneItems()
|
||||||
|
|
||||||
ensureNoteDirectory: ->
|
ensureNoteDirectory: ->
|
||||||
noteDirectory = fs.normalize(atom.config.get('nvatom.directory'))
|
noteDirectory = atom.config.get('nvatom.directory')
|
||||||
packagesDirectory = path.join(process.env.ATOM_HOME, 'packages')
|
packagesDirectory = path.join(process.env.ATOM_HOME, 'packages')
|
||||||
defaultNoteDirectory = path.join(packagesDirectory, 'nvatom', 'notebook')
|
defaultNoteDirectory = path.join(packagesDirectory, 'nvatom', 'notebook')
|
||||||
|
|
||||||
|
|||||||
@@ -1,26 +0,0 @@
|
|||||||
path = require 'path'
|
|
||||||
fs = require 'fs-plus'
|
|
||||||
|
|
||||||
module.exports =
|
|
||||||
class Utility
|
|
||||||
|
|
||||||
@getNotePath: (title) -> path.join(Utility.getNoteDirectory(), Utility.trim(title) + Utility.getPrimaryNoteExtension())
|
|
||||||
|
|
||||||
@getNoteDirectory: -> fs.normalize(atom.config.get('nvatom.directory'))
|
|
||||||
|
|
||||||
@getPrimaryNoteExtension: -> if atom.config.get('nvatom.extensions').length then atom.config.get('nvatom.extensions')[0] else '.md'
|
|
||||||
|
|
||||||
@isNote: (filePath) ->
|
|
||||||
return false unless path.extname(filePath) in atom.config.get('nvatom.extensions')
|
|
||||||
|
|
||||||
filePath = fs.normalize(filePath)
|
|
||||||
return true if filePath.startsWith(Utility.getNoteDirectory())
|
|
||||||
return true if filePath.startsWith(fs.realpathSync(Utility.getNoteDirectory()))
|
|
||||||
return false unless fs.existsSync(filePath)
|
|
||||||
|
|
||||||
filePath = fs.realpathSync(filePath)
|
|
||||||
return true if filePath.startsWith(Utility.getNoteDirectory())
|
|
||||||
return true if filePath.startsWith(fs.realpathSync(Utility.getNoteDirectory()))
|
|
||||||
return false
|
|
||||||
|
|
||||||
@trim: (str) -> str?.replace /^\s+|\s+$/g, ''
|
|
||||||
@@ -9,10 +9,6 @@
|
|||||||
'label': 'Toggle'
|
'label': 'Toggle'
|
||||||
'command': 'nvatom:toggle'
|
'command': 'nvatom:toggle'
|
||||||
}
|
}
|
||||||
{
|
|
||||||
'label': 'Open Interlink'
|
|
||||||
'command': 'nvatom:openInterlink'
|
|
||||||
}
|
|
||||||
]
|
]
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
+5
-11
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "nvatom",
|
"name": "nvatom",
|
||||||
"main": "./lib/notational-velocity",
|
"main": "./lib/notational-velocity",
|
||||||
"version": "0.9.2",
|
"version": "0.8.1",
|
||||||
"private": true,
|
"private": true,
|
||||||
"contributors": [
|
"contributors": [
|
||||||
"Seongjae Lee <seongjae@gmail.com>",
|
"Seongjae Lee <seongjae@gmail.com>",
|
||||||
@@ -9,13 +9,9 @@
|
|||||||
"Jonathan Hoyt <hoyt@github.com>"
|
"Jonathan Hoyt <hoyt@github.com>"
|
||||||
],
|
],
|
||||||
"description": "Notational Velocity for Atom",
|
"description": "Notational Velocity for Atom",
|
||||||
"keywords": [
|
"activationCommands": {
|
||||||
"wiki",
|
"atom-workspace": "nvatom:toggle"
|
||||||
"notational velocity",
|
},
|
||||||
"nvatom",
|
|
||||||
"note",
|
|
||||||
"notetaking"
|
|
||||||
],
|
|
||||||
"repository": "https://github.com/seongjaelee/nvatom",
|
"repository": "https://github.com/seongjaelee/nvatom",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"engines": {
|
"engines": {
|
||||||
@@ -32,7 +28,5 @@
|
|||||||
"fs-plus": "2.x",
|
"fs-plus": "2.x",
|
||||||
"underscore-plus": "^1.6.6"
|
"underscore-plus": "^1.6.6"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {}
|
||||||
"temp": "0.8.1"
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,105 +0,0 @@
|
|||||||
fs = require 'fs-plus'
|
|
||||||
path = require 'path'
|
|
||||||
temp = require 'temp'
|
|
||||||
Interlink = require '../lib/interlink'
|
|
||||||
|
|
||||||
temp.track()
|
|
||||||
|
|
||||||
describe 'Interlink', ->
|
|
||||||
defaultDirectory = atom.config.get('nvatom.directory')
|
|
||||||
noteDirectory = null
|
|
||||||
|
|
||||||
beforeEach ->
|
|
||||||
workspaceElement = atom.views.getView(atom.workspace)
|
|
||||||
noteDirectory = temp.mkdirSync()
|
|
||||||
|
|
||||||
atom.config.set('nvatom.directory', noteDirectory)
|
|
||||||
|
|
||||||
waitsForPromise ->
|
|
||||||
atom.packages.activatePackage('nvatom')
|
|
||||||
|
|
||||||
afterEach ->
|
|
||||||
atom.config.set('nvatom.directory', defaultDirectory)
|
|
||||||
|
|
||||||
describe 'when getInterlinkUnderCursor is called', ->
|
|
||||||
editor = null
|
|
||||||
|
|
||||||
describe 'under the note directory', ->
|
|
||||||
beforeEach ->
|
|
||||||
waitsForPromise ->
|
|
||||||
atom.workspace.open(path.join(noteDirectory, 'Interlink.md')).then (o) -> editor = o
|
|
||||||
|
|
||||||
it 'returns a trimmed interlink text', ->
|
|
||||||
testdata = [
|
|
||||||
{ position: [0, 2], text: '[[Car]]', expected: 'Car' },
|
|
||||||
{ position: [0, 2], text: '[[Notational Velocity]]', expected: 'Notational Velocity' },
|
|
||||||
{ position: [0, 2], text: '[[한글 Alphabet Test]]', expected: '한글 Alphabet Test' },
|
|
||||||
{ position: [0, 2], text: '[[ Car ]]', expected: 'Car' },
|
|
||||||
{ position: [0, 2], text: '[[Car/Mini]]', expected: 'Car/Mini' },
|
|
||||||
]
|
|
||||||
|
|
||||||
for testitem in testdata
|
|
||||||
editor.setText testitem.text
|
|
||||||
editor.setCursorBufferPosition testitem.position
|
|
||||||
expect(Interlink.getInterlinkUnderCursor(editor)).toBe testitem.expected
|
|
||||||
|
|
||||||
it 'returns undefined for invalid text', ->
|
|
||||||
testdata = [
|
|
||||||
{ position: [0, 2], text: '[[]]' },
|
|
||||||
{ position: [0, 3], text: '[[]]' },
|
|
||||||
{ position: [0, 2], text: '[[ ]]' },
|
|
||||||
{ position: [0, 1], text: '[Car]' },
|
|
||||||
{ position: [0, 2], text: '[[[Car]]]' },
|
|
||||||
{ position: [0, 2], text: '[[Car]' },
|
|
||||||
{ position: [0, 2], text: '[[Car]]]' },
|
|
||||||
{ position: [0, 1], text: 'Car' },
|
|
||||||
]
|
|
||||||
|
|
||||||
for testitem in testdata
|
|
||||||
editor.setText testitem.text
|
|
||||||
editor.setCursorBufferPosition testitem.position
|
|
||||||
expect(Interlink.getInterlinkUnderCursor(editor)).toBe undefined
|
|
||||||
|
|
||||||
describe 'under a random directory', ->
|
|
||||||
beforeEach ->
|
|
||||||
waitsForPromise ->
|
|
||||||
atom.workspace.open(path.join(temp.mkdirSync(), 'Interlink.md')).then (o) -> editor = o
|
|
||||||
|
|
||||||
it 'does not apply the grammar', ->
|
|
||||||
editor.setText '[[Car]]'
|
|
||||||
editor.setCursorBufferPosition [0, 2]
|
|
||||||
expect(Interlink.getInterlinkUnderCursor(editor)).toBe undefined
|
|
||||||
|
|
||||||
describe 'when openInterlink is called', ->
|
|
||||||
describe 'when the editor path is under the note directory', ->
|
|
||||||
editor = null
|
|
||||||
|
|
||||||
beforeEach ->
|
|
||||||
waitsForPromise ->
|
|
||||||
atom.workspace.open(path.join(noteDirectory, 'Interlink.md')).then (o) -> editor = o
|
|
||||||
|
|
||||||
it 'opens the referred notes', ->
|
|
||||||
editor.setText '[[Car]]'
|
|
||||||
editor.setCursorBufferPosition [0, 2]
|
|
||||||
|
|
||||||
editorPromise = Interlink.openInterlink()
|
|
||||||
expect(editorPromise).not.toBe undefined
|
|
||||||
waitsForPromise ->
|
|
||||||
editorPromise
|
|
||||||
|
|
||||||
runs ->
|
|
||||||
expect(atom.workspace.getActiveTextEditor().getPath().endsWith('Car.md')).toBe true
|
|
||||||
|
|
||||||
describe 'when the editor path is not under the note directory', ->
|
|
||||||
editor = null
|
|
||||||
|
|
||||||
beforeEach ->
|
|
||||||
waitsForPromise ->
|
|
||||||
atom.workspace.open(path.join(temp.mkdirSync(), 'Interlink.md')).then (o) -> editor = o
|
|
||||||
|
|
||||||
it 'does nothing', ->
|
|
||||||
editor.setText '[[Car]]'
|
|
||||||
editor.setCursorBufferPosition [0, 2]
|
|
||||||
|
|
||||||
editorPromise = Interlink.openInterlink()
|
|
||||||
expect(editorPromise).toBe undefined
|
|
||||||
@@ -1,7 +1,4 @@
|
|||||||
path = require 'path'
|
path = require 'path'
|
||||||
temp = require 'temp'
|
|
||||||
|
|
||||||
temp.track()
|
|
||||||
|
|
||||||
describe "nvAtom", ->
|
describe "nvAtom", ->
|
||||||
defaultDirectory = atom.config.get('nvatom.directory')
|
defaultDirectory = atom.config.get('nvatom.directory')
|
||||||
@@ -10,38 +7,41 @@ describe "nvAtom", ->
|
|||||||
|
|
||||||
beforeEach ->
|
beforeEach ->
|
||||||
workspaceElement = atom.views.getView(atom.workspace)
|
workspaceElement = atom.views.getView(atom.workspace)
|
||||||
|
activationPromise = atom.packages.activatePackage('nvatom')
|
||||||
|
atom.config.set('nvatom.directory', 'testdata')
|
||||||
|
|
||||||
afterEach ->
|
afterEach ->
|
||||||
atom.config.set('nvatom.directory', defaultDirectory)
|
atom.config.set('nvatom.directory', defaultDirectory)
|
||||||
|
|
||||||
describe "when the nvatom:toggle event is triggered", ->
|
describe "when the nvatom:toggle event is triggered", ->
|
||||||
it "attaches and then detaches the view", ->
|
it "attaches and then detaches the view", ->
|
||||||
noteDirectory = path.join(temp.mkdirSync())
|
expect(workspaceElement.querySelector('.nvatom')).not.toExist()
|
||||||
atom.config.set('nvatom.directory', noteDirectory)
|
|
||||||
|
# This is an activation event, triggering it will cause the package to be activated.
|
||||||
|
atom.commands.dispatch workspaceElement, 'nvatom:toggle'
|
||||||
|
|
||||||
waitsForPromise ->
|
waitsForPromise ->
|
||||||
atom.packages.activatePackage('nvatom')
|
activationPromise
|
||||||
|
|
||||||
runs ->
|
runs ->
|
||||||
expect(workspaceElement.querySelector('.nvatom')).not.toExist()
|
|
||||||
|
|
||||||
atom.commands.dispatch workspaceElement, 'nvatom:toggle'
|
|
||||||
expect(workspaceElement.querySelector('.nvatom')).toExist()
|
expect(workspaceElement.querySelector('.nvatom')).toExist()
|
||||||
expect(workspaceElement.querySelector('.nvatom').parentNode.style.display).not.toBe 'none'
|
|
||||||
|
|
||||||
atom.commands.dispatch workspaceElement, 'nvatom:toggle'
|
atom.commands.dispatch workspaceElement, 'nvatom:toggle'
|
||||||
expect(workspaceElement.querySelector('.nvatom').parentNode.style.display).toBe 'none'
|
|
||||||
|
|
||||||
it "checks if we banned the default directory under packages directory", ->
|
it "checks if we banned the default directory under packages directory", ->
|
||||||
noteDirectory = path.join(process.env.ATOM_HOME, 'packages', 'nvatom', 'notebook')
|
atom.notifications.clear()
|
||||||
atom.config.set('nvatom.directory', noteDirectory)
|
|
||||||
|
|
||||||
waitsForPromise ->
|
waitsForPromise ->
|
||||||
atom.packages.activatePackage('nvatom')
|
atom.packages.activatePackage('notifications')
|
||||||
|
|
||||||
runs ->
|
runs ->
|
||||||
|
noteDirectoryUnderPackageDirectory = path.join(process.env.ATOM_HOME, 'packages', 'nvatom', 'notebook')
|
||||||
|
atom.config.set('nvatom.directory', noteDirectoryUnderPackageDirectory)
|
||||||
|
|
||||||
|
# This is an activation event, triggering it will cause the package to be activated.
|
||||||
|
atom.commands.dispatch workspaceElement, 'nvatom:toggle'
|
||||||
|
|
||||||
waitsForPromise ->
|
waitsForPromise ->
|
||||||
atom.packages.activatePackage('notifications')
|
activationPromise
|
||||||
|
|
||||||
runs ->
|
runs ->
|
||||||
notificationContainer = workspaceElement.querySelector('atom-notifications')
|
notificationContainer = workspaceElement.querySelector('atom-notifications')
|
||||||
|
|||||||
@@ -1,54 +0,0 @@
|
|||||||
fs = require 'fs-plus'
|
|
||||||
path = require 'path'
|
|
||||||
temp = require 'temp'
|
|
||||||
Utility = require '../lib/utility'
|
|
||||||
|
|
||||||
temp.track()
|
|
||||||
|
|
||||||
describe "utility", ->
|
|
||||||
defaultNoteDirectory = atom.config.get('nvatom.directory')
|
|
||||||
defaultNoteExtensions = atom.config.get('nvatom.extensions')
|
|
||||||
|
|
||||||
afterEach ->
|
|
||||||
atom.config.set('nvatom.directory', defaultDirectory)
|
|
||||||
atom.config.set('nvatom.extensions', defaultNoteExtensions)
|
|
||||||
|
|
||||||
describe 'trim', ->
|
|
||||||
expect(Utility.trim(null)).toBe(undefined)
|
|
||||||
expect(Utility.trim(undefined)).toBe(undefined)
|
|
||||||
expect(Utility.trim('')).toBe('')
|
|
||||||
expect(Utility.trim(' ')).toBe('')
|
|
||||||
expect(Utility.trim(' hello world ')).toBe('hello world')
|
|
||||||
expect(Utility.trim(' hello world\t\n\r ')).toBe('hello world')
|
|
||||||
|
|
||||||
describe 'getPrimaryNoteExtension', ->
|
|
||||||
atom.config.set('nvatom.extensions', ['.md', '.markdown'])
|
|
||||||
expect(Utility.getPrimaryNoteExtension()).toBe('.md')
|
|
||||||
atom.config.set('nvatom.extensions', ['.markdown'])
|
|
||||||
expect(Utility.getPrimaryNoteExtension()).toBe('.markdown')
|
|
||||||
atom.config.set('nvatom.extensions', [])
|
|
||||||
expect(Utility.getPrimaryNoteExtension()).toBe('.md')
|
|
||||||
|
|
||||||
describe 'isNote handles symlinks correctly', ->
|
|
||||||
atom.config.set('nvatom.extensions', ['.md', '.markdown'])
|
|
||||||
|
|
||||||
tempDirectoryPath = path.join(temp.mkdirSync())
|
|
||||||
noteDirectoryPath = path.join(temp.mkdirSync())
|
|
||||||
noteDirectoryPathSymlink = path.join(tempDirectoryPath, 'note book')
|
|
||||||
notePath = path.join(noteDirectoryPath, 'note.md')
|
|
||||||
notePathSymlink = path.join(noteDirectoryPathSymlink, 'note symlink.md')
|
|
||||||
|
|
||||||
fs.writeFileSync(notePath, 'dummy')
|
|
||||||
fs.symlinkSync(noteDirectoryPath, noteDirectoryPathSymlink)
|
|
||||||
fs.symlinkSync(notePath, notePathSymlink)
|
|
||||||
|
|
||||||
expect(fs.existsSync(notePath)).toBe(true)
|
|
||||||
expect(fs.existsSync(fs.normalize(notePath))).toBe(true)
|
|
||||||
|
|
||||||
atom.config.set('nvatom.directory', noteDirectoryPath)
|
|
||||||
expect(Utility.isNote(notePath)).toBe(true)
|
|
||||||
expect(Utility.isNote(notePathSymlink)).toBe(true)
|
|
||||||
|
|
||||||
atom.config.set('nvatom.directory', noteDirectoryPathSymlink)
|
|
||||||
expect(Utility.isNote(notePath)).toBe(true)
|
|
||||||
expect(Utility.isNote(notePathSymlink)).toBe(true)
|
|
||||||
Reference in New Issue
Block a user