Adds support for tracking series and generating pages based on them.
[quanlib.git] / main.rb
diff --git a/main.rb b/main.rb
index 8617ab0146577146d30e6ec73c21c7856ab03a1c..f3371b7d44daf55b9d65c3bbaf488b213d0f091b 100644 (file)
--- a/main.rb
+++ b/main.rb
+require 'page'
+require 'store'
 require 'walkdir'
 
 outputDir = 'output'
 
-books = []
+book_ids = []
 imageCount = 0
 
+def handleArg(arg)
+  if "--purge" == arg
+    puts 'Purging database...'
+    @store.dropSchema()
+  elsif arg.start_with?("--")
+    abort('ERROR:  Unrecognized option "' + arg + '".')
+  end
+end
+
+@store = Store.new()
+@store.connect()
+
 for arg in ARGV
-  w = WalkDir.new(arg)
-  books += (w.books)
+  handleArg(arg)
 end
 
-if ! Dir.exist?(outputDir)
-  Dir.mkdir(outputDir)
+@store.init_db()
+
+for arg in ARGV
+  if ! arg.start_with?("--")
+    puts 'Scanning directory "' + arg + '"...'
+    w = WalkDir.new(@store, arg)
+    book_ids += (w.books)
+  end
 end
 
-open(outputDir + '/index.html', 'w') do |fd|
-  fd.puts '<html>'
-  fd.puts '  <head>'
-  fd.puts '    <meta charset="utf-8"/>'
-  fd.puts '    <title>Books</title>'
-  fd.puts '    <style>'
-  fd.puts 'div { '
-  fd.puts '  display: inline-block;'
-  fd.puts '  width: 400px;'
-  fd.puts '  margin: 10px;'
-  fd.puts '  border 3px solid #73ad21;'
-  fd.puts '}'
-  fd.puts '    </style>'
-  fd.puts '  </head>'
-  fd.puts '  <body>'
-  
-  for book in books
-    image = nil
-    if nil != book.cover
-      imageCount += 1
-      (path, mimeType) = book.cover.writeImage(outputDir, 'image' + imageCount.to_s)
-      image = '<img height="200px" src="' + path + '"/>'
-    else
-      image = '(No cover image)'
-    end
+puts 'Creating output...'
 
-    fd.puts '    <div><table>'
-    fd.puts '      <tr><td><a href="' + book.path + '">' + image + '</a></td><td>' + book.describe() + '</td></tr>'
-    fd.puts '    </table></div>'
+atoz_counts = {}
+
+('A'..'Z').each do |letter| 
+  book_ids = @store.query_books_by_author(letter + '%')
+  puts 'Authors starting with "' + letter + '":  ' + book_ids.length.to_s() + ' books.'
+  atoz_counts[letter] = book_ids.length
+
+  page = Page.new(@store)
+  if 'A' != letter
+    page.back = ['../atoz/output_' + (letter.ord - 1).chr + '.html', 'Prev']
+  end
+  if 'Z' != letter
+    page.forward = ['../atoz/output_' + (letter.ord + 1).chr + '.html', 'Next']
   end
+  page.output_dir = 'atoz'
+  page.index_file = 'output_' + letter + '.html'
+  page.title = "Authors starting with '" + letter + "'"
+  page.up = ['../atoz/index.html', 'Index']
+
+  page.write_html(book_ids)
+end
+
+
+ages = ['beginner', 'junior', 'ya', 'adult']
+
+series_infos = []
+
+ages.each do |age|
+  puts 'Series for "' + age + '" readers...'
+
+  series_ids = @store.query_series_by_age(age)
+
+  series_ids.each do |id|
+    series = @store.load_series(id)
+    book_ids = @store.query_books_by_series_id(id)
+    if nil != book_ids and book_ids.length > 0
+      series_infos.push( [series, book_ids] )
+    end
+  end
+
+  for idx in 0 .. (series_infos.length - 1) do 
+    #puts series.descr + ': ' + book_ids.length.to_s + ' books.'
+
+    back = nil
+    fwd = nil
+
+    if idx > 0
+      back = series_infos[idx-1]
+    end
+    if idx < (series_infos.length - 1)
+      fwd = series_infos[idx+1]
+    end
+
+    cur = series_infos[idx]
+    series = cur[0]
+    book_ids = cur[1]
+
+    page = Page.new(@store)
+    if nil != back
+      page.back = [back[0].key + '.html', 'Back']
+    end
+    if nil != fwd
+      page.forward = [fwd[0].key + '.html', 'Forward']
+    end
+    page.output_dir = 'series'
+    page.index_file = series.key + '.html'
+    page.title = 'Series &ldquo;' + series.descr + '&rdquo; (' + book_ids.length.to_s + ' books)'
+    page.up = ['../atoz/index.html', 'Index']
   
-  fd.puts "    </table>"
-  fd.puts "  </body>"
-  fd.puts "</html>"
+    page.write_html(book_ids)
+  end
+end
+
+content = '<table><tr><th>Author</th><th>Books</th></tr>'
+('A'..'Z').each do |letter|
+  content += '  <tr><td><a href="../atoz/output_' + letter + '.html">Starting with ' + letter + '</a></td><td>' + atoz_counts[letter].to_s + '</td></tr>'
 end
+page = Page.new(@store)
+page.output_dir = 'atoz'
+page.special = content
+page.write_html( [] )
+  
+@store.disconnect()