87 lines
2.7 KiB
CoffeeScript
87 lines
2.7 KiB
CoffeeScript
#
|
|
# Crafting Guide - file_cache.coffee
|
|
#
|
|
# Copyright © 2014-2016 by Redwood Labs
|
|
# All rights reserved.
|
|
#
|
|
|
|
########################################################################################################################
|
|
|
|
module.exports = class FileCache extends Backbone.Events
|
|
|
|
@::FILE_TOKEN = '#file='
|
|
|
|
constructor: (url)->
|
|
@_ajax = $.ajax
|
|
@_files = {}
|
|
@_loading = w.resolve(true)
|
|
|
|
if url? then @loadArchive(url).catch(->)
|
|
|
|
# Public Methods ###############################################################################
|
|
|
|
getFile: (file)->
|
|
return null unless @hasFile file
|
|
return @_files[file]
|
|
|
|
hasFile: (file)->
|
|
return @_files[file]?
|
|
|
|
loadArchive: (url)->
|
|
if not _.isFunction(@_ajax) then throw new Error '$.ajax is required'
|
|
|
|
newLoading = w.promise (resolve, reject)=>
|
|
@_ajax
|
|
url: url
|
|
dataType: 'text'
|
|
success: (text, status, xhr)=> resolve @_onLoadSuccess text, status, xhr
|
|
error: (xhr, status, error)=> resolve @_onLoadError error, status, xhr
|
|
|
|
@_loading = w.join @_loading, newLoading
|
|
|
|
# Property Methods #############################################################################
|
|
|
|
Object.defineProperties @prototype,
|
|
|
|
loading:
|
|
get: -> return @_loading
|
|
|
|
# Private Methods ##############################################################################
|
|
|
|
_onLoadError: (error, status, xhr)->
|
|
console.error "Failed to load archive: #{xhr.responseText}"
|
|
return false
|
|
|
|
_onLoadSuccess: (text, status, xhr)->
|
|
return @_parseArchive text
|
|
|
|
_parseArchive: (text)->
|
|
file = null
|
|
tokenIndex = nameStartIndex = nameEndIndex = fileStartIndex = fileEndIndex = 0
|
|
fileCount = 0
|
|
|
|
while true
|
|
tokenIndex = text.indexOf @FILE_TOKEN, fileStartIndex
|
|
if tokenIndex is -1
|
|
if file?
|
|
@_files[file] = text.substring fileStartIndex, text.length
|
|
fileCount += 1
|
|
break
|
|
|
|
if file?
|
|
fileEndIndex = tokenIndex - 1
|
|
@_files[file] = text.substring fileStartIndex, fileEndIndex
|
|
fileCount += 1
|
|
|
|
nameStartIndex = tokenIndex + @FILE_TOKEN.length
|
|
nameEndIndex = text.indexOf '\n', nameStartIndex
|
|
if nameEndIndex is -1
|
|
file = text.substring nameStartIndex, text.length
|
|
@_files[file] = ''
|
|
break
|
|
|
|
file = text.substring nameStartIndex, nameEndIndex
|
|
fileStartIndex = nameEndIndex + '\n'.length
|
|
|
|
return fileCount > 0
|