+
+require './author.rb'
+
+class Book
+ def initialize(fileName)
+ @author = nil
+ @cover = nil
+ @series = nil
+ @title = nil
+ @volume = nil
+
+ parseFileName!(fileName)
+ end
+
+ def self.canHandle?(fileName)
+ if nil == fileName
+ return false
+ end
+
+ lowerName = fileName.downcase()
+
+ if lowerName.end_with?(".epub")
+ return true
+ end
+
+ return false
+ end
+
+ def inspect
+ data = []
+ if nil != @series
+ data.push('series="' + @series + '"')
+ end
+ if nil != @volume
+ data.push('volume="' + @volume + '"')
+ end
+ if nil != @title
+ data.push('title="' + @title + '"')
+ end
+ if nil != @author
+ data.push('author="' + @author + '"')
+ end
+ return '(Book:' + data.join(',') + ')'
+ end
+
+ def to_s
+ return inspect()
+ end
+
+ protected
+ def isUpper?(c)
+ return /[[:upper:]]/.match(c)
+ end
+
+ protected
+ def massageAuthor(input)
+ if nil == input
+ return nil
+ end
+
+ result = ""
+ input.each_char do |c|
+ if isUpper?(c) and (result.length > 0)
+ result += " "
+ end
+ result += c
+ end
+
+ return result
+ end
+
+ # Returns (series, volumeNo, titleText)
+ protected
+ def processTitle(input)
+ if nil == input
+ return nil
+ end
+
+ arr = input.split('_')
+
+ series = nil
+ vol = nil
+
+ first = arr[0]
+ matchData = (arr[0]).match(/^([A-Z]+)([0-9]+)$/)
+ if nil != matchData
+ capt = matchData.captures
+ series = capt[0]
+ vol = capt[1]
+ arr.shift
+ end
+
+ pos = arr[-1].rindex('.')
+ if nil != pos
+ arr[-1] = arr[-1].slice(0, pos)
+ end
+
+ title = arr.join(' ')
+
+ return series, vol, title
+ end
+
+ protected
+ def parseFileName!(fileName)
+ parts = fileName.split('/')
+ (@series, @volume, @title) = processTitle(parts[-1])
+ if parts.length > 1
+ @author = massageAuthor(parts[-2])
+ end
+ end
+end