You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

46 lines
1.8 KiB

"""
This module exists solely to figure how long a registrant/publication
number may be within an ISBN. The rules change based on the prefix and
language/region. This list of rules only encapsulates the 978 prefix
for English books. 978 is the largest and, until recently, the only
prefix.
The complete list of prefixes and rules can be found at
https://www.isbn-international.org/range_file_generation
"""
from collections import namedtuple
from typing import Dict, List
RegistrantRule = namedtuple("RegistrantRule", ["min", "max", "registrant_length"])
# Structure: RULES[`EAN Prefix`][`Registration Group`] = [Rule1, Rule2, ...]
RULES: Dict[str, Dict[str, List[RegistrantRule]]] = {
"978": {
"0": [
RegistrantRule("0000000", "1999999", 2),
RegistrantRule("2000000", "2279999", 3),
RegistrantRule("2280000", "2289999", 4),
RegistrantRule("2290000", "6479999", 3),
RegistrantRule("6480000", "6489999", 7),
RegistrantRule("6490000", "6999999", 3),
RegistrantRule("7000000", "8499999", 4),
RegistrantRule("8500000", "8999999", 5),
RegistrantRule("9000000", "9499999", 6),
RegistrantRule("9500000", "9999999", 7),
],
"1": [
RegistrantRule("0000000", "0999999", 2),
RegistrantRule("1000000", "3999999", 3),
RegistrantRule("4000000", "5499999", 4),
RegistrantRule("5500000", "7319999", 5),
RegistrantRule("7320000", "7399999", 7),
RegistrantRule("7400000", "8697999", 5),
RegistrantRule("8698000", "9729999", 6),
RegistrantRule("9730000", "9877999", 4),
RegistrantRule("9878000", "9989999", 6),
RegistrantRule("9990000", "9999999", 7),
],
},
}