Sha256: fd8a8d3cbbabab75c933acf3eeee1078c982f02bba79a16c4b1dda6daf58f55e

Contents?: true

Size: 1.75 KB

Versions: 1

Compression:

Stored size: 1.75 KB

Contents

module ISBN
  extend self
  
	def calculate(isbn)
	  isbn = isbn.delete("-")
    isbn = isbn[0...-1] unless (isbn.size == 9 || isbn.size == 12)
    case isbn.size
    when 9
      weight  = (2..10).to_a.reverse
      mod     = 11
      check   = 'X'
    when 12
      weight  = [1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3]
      mod     = 10
      check   = '0'
    else
      raise InvalidISBNError
    end
    case check_digit = (mod - (isbn.chars.zip(weight).inject(0) {|s,i| s += i[0].to_i * i[1]} % mod))
    when 10 then  isbn << check
    when 11 then  isbn << '0'
    else          isbn << check_digit.to_s
    end
    isbn
	end
	
  def from_13_to_10(isbn)
    isbn = isbn.delete("-")
    raise "NOT 13 Digit ISBN" if isbn.size != 13
    calculate(isbn[/\d{3}(\d{9})(?:\d|X)/i, 1])
  end

  def from_10_to_13(isbn, used=false)
    isbn = isbn.delete("-")
    raise "NOT 10 Digit ISBN" if isbn.size != 10
    calculate("#{used ? '290' : '978'}#{isbn}")	   
  end
  
  def between_new_and_used(isbn)
    case isbn[0..2]
    when '978' then calculate(isbn.sub(/^978/, "290"))
    when '290' then calculate(isbn.sub(/^290/, "978"))
    end
  end

  def thirteen(isbn)
    case isbn.size
    when 13 then isbn
    when 10 then from_10_to_13(isbn)
    else raise InvalidISBNError
    end
  end

  def ten(isbn)
    case isbn.size
    when 13 then from_13_to_10(isbn)
    when 10 then isbn
    else raise InvalidISBNError
    end
  end

  def valid?(isbn)
    begin
      isbn[-1,1] == calculate(isbn)[-1,1]
    rescue InvalidISBNError => isbn_error
      false
    end
  end
  
  def book?(isbn)
    begin
      true if (isbn =~ /^(978|290)/i && ten(isbn)) || ten(isbn)
    rescue InvalidISBNError => isbn_error
      false
    end
    
  end
  
  class InvalidISBNError < RuntimeError
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
entangledstate-isbn-1.2.0 lib/isbn.rb