class Quran

The Main Quran class that allows querying.

@todo: I eventually want to have a Translator class that can
abstract different translations once we can find them. That
way, a user can query and retrive different translations and
tafsirs of a verse.

@author Zohaib Ahmed @since 0.0.1

Public Class Methods

new(langs=['ar']) click to toggle source

Initialize the Quran with the language(s) specified.

@param langs [Array]

@example

quran = Quran.new ['en', 'ar']
# File lib/quran.rb, line 19
def initialize(langs=['ar'])
  db = SQLite3::Database.new "lib/qurandb"
  db.results_as_hash = true

  @chapters = construct_dict(db, 'chapters', 'id')
  @languages = {}
  @default_lang = langs[0]

  possible_langs = ['en', 'ar', 'hi', 'uz', 'ur']
  langs.each do |lang|
    if possible_langs.include? lang
      @languages[lang] = construct_dict(db, lang, 'chapter')
    else
      raise "The language you asked for isn't supported yet."
    end
  end

  @juz = [
    {:name => "Alif-Lam-Mim", :start_chapter => 1, :start_verse => 1, :end_chapter => 2, :end_verse => 141},
    {:name => "Sayaqūl", :start_chapter => 2, :start_verse => 142, :end_chapter => 2, :end_verse => 252},
    {:name => "Tilka -r-rusul", :start_chapter => 2, :start_verse => 253, :end_chapter => 3, :end_verse => 92},
    {:name => "Lan Tana Lu", :start_chapter => 3, :start_verse => 93, :end_chapter => 4, :end_verse => 23},
    {:name => "W-al-muḥṣanāt", :start_chapter => 4, :start_verse => 24, :end_chapter => 4, :end_verse => 147},
    {:name => "Lā yuẖibbu-llāh", :start_chapter => 4, :start_verse => 148, :end_chapter => 5, :end_verse => 81},
    {:name => "Wa ʾidha samiʿū", :start_chapter => 5, :start_verse => 82, :end_chapter => 6, :end_verse => 110},
    {:name => "Wa law ʾannanā", :start_chapter => 6, :start_verse => 111, :end_chapter => 7, :end_verse => 87},
    {:name => "Qāl al-malāʾ", :start_chapter => 7, :start_verse => 88, :end_chapter => 8, :end_verse => 40},
    {:name => "W-aʿlamū", :start_chapter => 8, :start_verse => 41, :end_chapter => 9, :end_verse => 92},
    {:name => "Yaʾtadhirūna", :start_chapter => 9, :start_verse => 93, :end_chapter => 11, :end_verse => 5},
    {:name => "Wa mā min dābbah", :start_chapter => 11, :start_verse => 6, :end_chapter => 12, :end_verse => 52},
    {:name => "Wa mā ʾubarriʾu", :start_chapter => 12, :start_verse => 53, :end_chapter => 14, :end_verse => 52},
    {:name => "ʾAlif Lām Rāʾ", :start_chapter => 15, :start_verse => 1, :end_chapter => 16, :end_verse => 128},
    {:name => "Subḥāna -lladhi", :start_chapter => 17, :start_verse => 1, :end_chapter => 18, :end_verse => 74},
    {:name => "Qāla ʾa-lam", :start_chapter => 18, :start_verse => 75, :end_chapter => 20, :end_verse => 135},
    {:name => "Aqtaraba li-n-nās", :start_chapter => 21, :start_verse => 1, :end_chapter => 22, :end_verse => 78},
    {:name => "Qad ʾaflaḥa", :start_chapter => 23, :start_verse => 1, :end_chapter => 25, :end_verse => 20},
    {:name => "Wa-qāla -lladhīna", :start_chapter => 25, :start_verse => 21, :end_chapter => 27, :end_verse => 55},
    {:name => "Am-man khalaq", :start_chapter => 27, :start_verse => 56, :end_chapter => 29, :end_verse => 45},
    {:name => "Utlu ma uhiya", :start_chapter => 29, :start_verse => 46, :end_chapter => 33, :end_verse => 30},
    {:name => "Wa-man yaqnut", :start_chapter => 33, :start_verse => 31, :end_chapter => 36, :end_verse => 27},
    {:name => "Wa-mā-liya", :start_chapter => 36, :start_verse => 28, :end_chapter => 39, :end_verse => 31},
    {:name => "Fa-man ʾaẓlamu", :start_chapter => 39, :start_verse => 21, :end_chapter => 41, :end_verse => 46},
    {:name => "ʾIlaihi yuraddu", :start_chapter => 41, :start_verse => 47, :end_chapter => 45, :end_verse => 37},
    {:name => "Ḥāʾ Mīm", :start_chapter => 46, :start_verse => 1, :end_chapter => 51, :end_verse => 30},
    {:name => "Qāla fa-mā khatbukum", :start_chapter => 51, :start_verse => 31, :end_chapter => 57, :end_verse => 29},
    {:name => "Qad samiʿa -llāhu", :start_chapter => 58, :start_verse => 1, :end_chapter => 66, :end_verse => 12},
    {:name => "Tabāraka -lladhi", :start_chapter => 67, :start_verse => 1, :end_chapter => 77, :end_verse => 50},
    {:name => "Fa-man ʾaẓlamu", :start_chapter => 78, :start_verse => 1, :end_chapter => 114, :end_verse => 6}
  ]

  return
end

Public Instance Methods

get(chapter, verse, lang=@default_lang) click to toggle source

Initialize the Quran with the language(s) specified.

@param chapter [String]

@example

quran = Quran.new ['en', 'ar']
# File lib/quran.rb, line 79
def get(chapter, verse, lang=@default_lang)
  if verse.nil?
    raise "Verse does not exist."
  end

  if verse < 1
    raise "Verse does not exist."
  end

  verses = @languages[lang][chapter]

  if verses.nil?
    raise "Chapter does not exist"
  end

  row = verses[verse - 1]

  if row.nil?
    raise "Verse does not exist."
  end

  return row
end
get_chapter(chapter, lang=@default_lang) click to toggle source

Get the contents of the entire chapter.

@param chapter [Integer] the chapter number @param lang [String] the language for the content

@return [Array] Array of hashes containing verses in the chapter

# File lib/quran.rb, line 109
def get_chapter(chapter, lang=@default_lang)
  return @languages[lang][chapter]
end
juz(juz_number) click to toggle source

Get the details for a particular Juz

@param juz_number [Integer] the juz number

@return [Hash] details of the Juz

# File lib/quran.rb, line 119
def juz(juz_number)
  return @juz[juz_number]
end

Private Instance Methods

construct_dict(db, table, key) click to toggle source

Construct a dict from a table in the db. The key is specified in key. The values will be a dict that contains the rest of the columns in the table.

@param db [SQLite3] @param table [String] @param key [String]

@return [Hash]

# File lib/quran.rb, line 161
def construct_dict(db, table, key)
  query_str = "SELECT * FROM #{table}"
  final_hash = {}
  db.execute(query_str) do |row|
    hash_key = row[key]
    # get all the values
    vals = {}
    row.keys.each do |other_key|
      # if the other_key is a type string, take it, otherwise ignore.
      if other_key.is_a? String
        vals[other_key] = row[other_key]
      end
    end

    if final_hash.has_key?(hash_key)
      final_hash[hash_key] << vals
    else
      final_hash[hash_key] = [vals]
    end
  end
  return final_hash
end