Track filename in book
[quanlib.git] / book.rb
1
2 require './author.rb'
3
4 class Book
5   def initialize(fileName)
6     @author = nil
7     @cover = nil
8     @path = fileName
9     @series = nil
10     @title = nil
11     @volume = nil
12
13     parseFileName!(fileName)
14   end
15
16   def self.canHandle?(fileName)
17     if nil == fileName
18       return false
19     end
20
21     lowerName = fileName.downcase()
22
23     if lowerName.end_with?(".epub")
24       return true
25     end
26
27     return false
28   end
29
30   def inspect
31     data = []
32     if nil != @author
33       data.push('author="' + @author + '"')
34     end
35     if nil != @series
36       data.push('series="' + @series + '"')
37     end
38     if nil != @volume
39       data.push('volume="' + @volume + '"')
40     end
41     if nil != @title
42       data.push('title="' + @title + '"')
43     end
44     if nil != @path
45       data.push('path="' + @path + '"')
46     end
47     return '(Book:' + data.join(',') + ')'
48   end
49
50   def to_s
51     return inspect()
52   end
53
54   protected
55   def isUpper?(c)
56     return /[[:upper:]]/.match(c)
57   end
58
59   protected
60   def massageAuthor(input)
61     if nil == input
62       return nil
63     end
64
65     result = ""
66     input.each_char do |c|
67       if isUpper?(c) and (result.length > 0)
68         result += " "
69       end
70       result += c
71     end
72     
73     return result
74   end
75
76   # Returns (series, volumeNo, titleText)
77   protected
78   def processTitle(input)
79     if nil == input
80       return nil
81     end
82
83     arr = input.split('_')
84
85     series = nil
86     vol = nil
87
88     first = arr[0]
89     matchData = (arr[0]).match(/^([A-Z]+)([0-9]+)$/)
90     if nil != matchData
91       capt = matchData.captures
92       series = capt[0]
93       vol = capt[1]
94       arr.shift
95     end
96
97     pos = arr[-1].rindex('.')
98     if nil != pos
99       arr[-1] = arr[-1].slice(0, pos)
100     end
101
102     title = arr.join(' ')
103
104     return series, vol, title
105   end
106
107   protected
108   def parseFileName!(fileName)
109     parts = fileName.split('/')
110     (@series, @volume, @title) = processTitle(parts[-1])
111     if parts.length > 1
112       @author = massageAuthor(parts[-2])
113     end
114   end
115 end