Refactor the SAYT code to return better results

This commit is contained in:
Andrew Miner
2015-01-15 17:12:12 -08:00
parent a50e3d9621
commit d94bd39e52
7 changed files with 87 additions and 85 deletions
@@ -9,6 +9,7 @@ BaseController = require './base_controller'
{Duration} = require '../constants'
{Key} = require '../constants'
ImageLoader = require './image_loader'
NameFinder = require '../models/name_finder'
StackController = require './stack_controller'
########################################################################################################################
@@ -21,10 +22,10 @@ module.exports = class InventoryController extends BaseController
if not options.model? then throw new Error 'options.model is required'
if not options.modPack? then throw new Error 'options.modPack is required'
options.icon ?= '/images/chest_front.png'
options.editable ?= true
options.nameFinder ?= new NameFinder options.modPack
options.icon ?= '/images/chest_front.png'
options.imageLoader ?= new ImageLoader defaultUrl:'/images/unknown.png'
options.gatherNames ?= -> @modPack.gatherNames()
options.title ?= 'Inventory'
options.templateName = 'inventory'
@@ -34,7 +35,7 @@ module.exports = class InventoryController extends BaseController
@icon = options.icon
@imageLoader = options.imageLoader
@modPack = options.modPack
@gatherNames = options.gatherNames
@nameFinder = options.nameFinder
@title = options.title
@_stackControllers = []
@@ -173,7 +174,7 @@ module.exports = class InventoryController extends BaseController
onSelected = => @onItemSelected()
@$nameField.autocomplete
source: @gatherNames()
source: (request, callback)=> callback @nameFinder.search request.term
delay: 0
minLength: 0
change: onChanged
@@ -11,6 +11,7 @@ ImageLoader = require './image_loader'
InventoryController = require './inventory_controller'
ItemPage = require '../models/item_page'
ModPackController = require './mod_pack_controller'
NameFinder = require '../models/name_finder'
########################################################################################################################
@@ -45,7 +46,7 @@ module.exports = class ItemPageController extends BaseController
imageLoader: @imageLoader
model: @model.plan.have
modPack: @model.modPack
gatherNames: -> @modPack.gatherNames includeGatherable:true
nameFinder: new NameFinder @model.modPack, includeGatherable:true
title: 'Items you have'
@needController = @addChild InventoryController, '.need',
@@ -63,7 +64,7 @@ module.exports = class ItemPageController extends BaseController
@modPackController = @addChild ModPackController, '.view__mod_pack', model:@model.modPack
@$('.want .toolbar').append '<label><input class="includeTools" type="checkbox"> include tools</label'
@$('.want .toolbar').append '<label><input class="includeTools" type="checkbox"> include tools</label>'
@$includeToolsBox = @$('.includeTools')
super
-15
View File
@@ -76,21 +76,6 @@ module.exports = class ModPack extends BaseModel
result.itemUrl = Url.item result
return result
gatherNames: (options={})->
options.includeGatherable ?= false
options.includeDisabled ?= false
nameData = {}
for modVersion in @modVersions
continue unless modVersion.enabled or options.includeDisabled
modVersion.gatherNames nameData, options
result = []
names = _.keys(nameData).sort()
for name in names
result.push nameData[name]
return result
hasRecipe: (name, options={})->
options.includeDisabled ?= false
-16
View File
@@ -55,22 +55,6 @@ module.exports = class ModVersion extends BaseModel
findName: (slug)->
return @names[slug]
gatherNames: (result={}, options={})->
options.includeGatherable ?= false
for slug, item of @items
continue if result[item.slug]
if not item.isCraftable
continue unless options.includeGatherable
result[item.slug] = value:item.name, label:"#{item.name} (from #{@name} #{@version})"
if options.includeGatherable
for slug, name of @names
continue if result[slug]
result[slug] = value:name, label:"#{name} (from #{@name} #{@version})"
return result
hasRecipe: (name)->
item = @findItemByName name
return false unless item?
+79
View File
@@ -0,0 +1,79 @@
###
Crafting Guide - name_finder.coffee
Copyright (c) 2015 by Redwood Labs
All rights reserved.
###
########################################################################################################################
module.exports = class NameFinder
constructor: (modPack, options={})->
if not modPack? then throw new Error 'modPack is required'
options.includeGatherable ?= false
options.includeDisabledMods ?= false
options.limit ?= 25
@includeDisabledMods = options.includeDisabledMods
@includeGatherable = options.includeGatherable
@limit = options.limit
@modPack = modPack
@names = []
@_nameMap = {}
# Public Methods ###############################################################################
search: (nameHint='')->
nameHint = null if nameHint.trim() is ''
nameHint = nameHint.toLowerCase() if nameHint?
names = @_findNames nameHint
names.sort (a, b)->
c = a.modVersion.compareTo b.modVersion
if c isnt 0 then return c
return 0 if a.label is b.label
return if a.label < b.label then -1 else +1
names = names[0...@limit]
return names
# Private Methods ##############################################################################
_isMatch: (name, hint)->
nameWords = name.split ' '
hintWords = hint.split ' '
for hintWord in hintWords
while true
return false if nameWords.length is 0
nameWord = nameWords.shift()
break if nameWord.indexOf(hintWord) is 0
return true
_findNames: (nameHint=null)->
names = []
nameMap = {}
for modVersion in @modPack.modVersions
continue unless modVersion.enabled or @includeDisabledMods
for slug, name of modVersion.names
continue if nameMap[name]
item = modVersion.items[slug]
if not @includeGatherable
continue unless item? and (not item.isGatherable)
scanName = "#{modVersion.name} : #{name}"
if nameHint?
continue unless @_isMatch scanName.toLowerCase(), nameHint
nameMap[name] = name
names.push value:name, label:scanName, modVersion:modVersion
return names