Modify a filtering function from FuzzyFilter to our own

Add a feature to read markdown files only

Why we ditch FuzzyFilter?
1. It doesn't give a priority on the title match
2. It seems like to give unexpected search scores in a very, very long text
This commit is contained in:
Seong Jae Lee
2014-11-09 23:21:17 -08:00
parent 391a5d8261
commit 47d2e6cb69
+56
View File
@@ -1,5 +1,6 @@
path = require 'path'
fs = require 'fs'
fsPlus = require 'fs-plus'
{$, $$, SelectListView} = require 'atom'
module.exports =
@@ -11,6 +12,33 @@ class NotationalVelocityView extends SelectListView
@addClass('notational-velocity from-top overlay')
@loadData()
filter: (filterQuery) ->
queries = []
for queryStr in filterQuery.split(' ')
if queryStr.length
queries.push(new RegExp(queryStr, 'gim'))
perfs = []
for item,i in @items
perfs.push({score: 1, index: i})
for query in queries
for perf in perfs
result = @items[perf.index].filetext.match(query)
if result == null
perf.score = 0
continue
perf.score *= result.length
result = @items[perf.index].title.match(query)
if result != null
perf.score *= 10
perfs = perfs.filter (x) -> x.score > 0
perfs.sort (a, b) -> if a.score > b.score then -1 else 1
return (@items[p.index] for p in perfs)
loadData: ->
@data = []
@@ -19,6 +47,9 @@ class NotationalVelocityView extends SelectListView
for filename in fs.readdirSync(directory)
filepath = path.join(directory, filename)
if !fsPlus.isMarkdownExtension(path.extname(filename))
continue
filetext = fs.readFileSync(filepath, 'utf8')
title = ''
@@ -93,3 +124,28 @@ class NotationalVelocityView extends SelectListView
# super(view)
# return unless view.length
# console.log @list.indexOf(@list.find('.selected'))
populateList: ->
console.log 'populateList'
return unless @items?
filterQuery = @getFilterQuery()
if filterQuery.length
filteredItems = @filter(filterQuery)
#filteredItems = fuzzyFilter(@items, filterQuery, key: @getFilterKey())
else
filteredItems = @items
@list.empty()
if filteredItems.length
@setError(null)
for i in [0...Math.min(filteredItems.length, @maxItems)]
item = filteredItems[i]
itemView = $(@viewForItem(item))
itemView.data('select-list-item', item)
@list.append(itemView)
@selectItemView(@list.find('li:first'))
else
@setError(@getEmptyMessage(@items.length, filteredItems.length))