1 Commits
Author SHA1 Message Date
Seongjae Lee ce9869362a Make title search independent from DocQuery search 2015-09-18 00:14:52 -07:00
13 changed files with 99 additions and 344 deletions
-3
View File
@@ -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
-2
View File
@@ -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:
-18
View File
@@ -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'
}
]
-2
View File
@@ -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'
-48
View File
@@ -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
+65 -43
View File
@@ -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
+12 -11
View File
@@ -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')
-26
View File
@@ -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, ''
-4
View File
@@ -9,10 +9,6 @@
'label': 'Toggle' 'label': 'Toggle'
'command': 'nvatom:toggle' 'command': 'nvatom:toggle'
} }
{
'label': 'Open Interlink'
'command': 'nvatom:openInterlink'
}
] ]
] ]
} }
+5 -11
View File
@@ -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"
}
} }
-105
View File
@@ -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
+17 -17
View File
@@ -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')
-54
View File
@@ -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)