diff --git a/domdiv/card_db/labels_db.json b/domdiv/card_db/labels_db.json new file mode 100644 index 0000000..eeef435 --- /dev/null +++ b/domdiv/card_db/labels_db.json @@ -0,0 +1,63 @@ +[{ + "gap-horizontal": 0.76, + "gap-vertical": 0.0, + "height": 1.27, + "margin-left": 0.75, + "margin-top": 1.27, + "names": [ + "5167", + "5267", + "5667", + "5967", + "8167", + "8667", + "8867", + "8927", + "15267", + "15667", + "18167", + "18667", + "28667", + "48267", + "48467", + "48867", + "95667" + ], + "pad-horizontal": 0.1, + "pad-vertical": 0.1, + "paper": "LETTER", + "tab-only": true, + "width": 4.45 +},{ + "gap-horizontal": 0.116, + "gap-vertical": 0.0, + "height": 1.69, + "margin-left": 1.02, + "margin-top": 1.08, + "names": [ + "L4732", + "L7632" + ], + "pad-horizontal": 0.1, + "pad-vertical": 0.1, + "paper": "A4", + "tab-only": true, + "width": 3.56 +},{ + "body-height": 1.055, + "gap-horizontal": 0.295, + "gap-vertical": 0.0, + "height": 1.06, + "margin-left": 0.95, + "margin-top": 2.15, + "names": [ + "L4736", + "L6113" + ], + "pad-horizontal": 0.1, + "pad-vertical": 0.1, + "paper": "A4", + "tab-only": false, + "width": 4.53 +} +] diff --git a/domdiv/draw.py b/domdiv/draw.py index 9979d61..e59a95e 100644 --- a/domdiv/draw.py +++ b/domdiv/draw.py @@ -614,6 +614,10 @@ class DividerDrawer(object): return w def drawTab(self, card, rightSide, wrapper="no"): + # Skip blank cards + if card.isBlank(): + return + # draw tab flap self.canvas.saveState() if self.wantCentreTab(card): @@ -822,6 +826,9 @@ class DividerDrawer(object): self.canvas.restoreState() def drawText(self, card, divider_text="card", wrapper="no"): + # Skip blank cards + if card.isBlank(): + return self.canvas.saveState() usedHeight = 0 diff --git a/domdiv/main.py b/domdiv/main.py index 395492a..730d17b 100644 --- a/domdiv/main.py +++ b/domdiv/main.py @@ -24,6 +24,7 @@ TAB_SIDE_CHOICES = ["left", "right", "left-alternate", "right-alternate", "centre", "full"] TEXT_CHOICES = ["card", "rules", "blank"] EDITION_CHOICES = ["1", "2", "latest", "all"] +LABEL_CHOICES = ["8867", "L4732", "L4736"] EXPANSION_CHOICES = ["adventures", "alchemy", "base", "cornucopia", "dark ages", "dominion1stEdition", "dominion2ndEdition", "dominion2ndEditionUpgrade", @@ -312,8 +313,9 @@ def parse_opts(cmdline_args=None): help="Include four start decks with the Base cards.") group_select.add_argument( "--include-blanks", - action="store_true", - help="Include a few dividers with extra text.") + type=int, + default=0, + help="Number of blank dividers to include.") group_select.add_argument( "--exclude-events", action="store_true", @@ -425,6 +427,12 @@ def parse_opts(cmdline_args=None): action="store_true", help="In tabs-only mode, draw tabs on black background" ) + group_printing.add_argument( + "--label", + dest="label_name", + default=None, + help="Use preset label dimentions. Specify a label name. " + "This will override settings that conflict with the preset label settings.") group_printing.add_argument( "--info", action="store_true", @@ -498,6 +506,47 @@ def clean_opts(options): # keyword to indicate no options. Same as --fan without any expansions given options.fan = [] + if options.tabs_only and options.label_name is None: + # default is Avery 8867 + options.label_name = "8867" + + options.label = None + if options.label_name is not None: + # Load the Labels, and look for match + labels_db_filepath = os.path.join("card_db", "labels_db.json") + with get_resource_stream(labels_db_filepath) as labelfile: + label_info = json.loads(labelfile.read().decode('utf-8')) + assert label_info, "Could not load label information from database" + for label in label_info: + if options.label_name.upper() in [n.upper() for n in label['names']]: + options.label = label + break + + assert options.label is not None, "Label '{}' not defined".format(options.label_name) + + # Defaults for missing values + label = options.label + label['paper'] = label['paper'] if 'paper' in label else "LETTER" + label['tab-only'] = label['tab-only'] if 'tab-only' in label else True + label['body-height'] = label['body-height'] if 'body-height' in label else 0 + label['gap-vertical'] = label['gap-vertical'] if 'gap-vertical' in label else 0.0 + label['gap-horizontal'] = label['gap-horizontal'] if 'gap-horizontal' in label else 0.0 + label['pad-vertical'] = label['pad-vertical'] if 'pad-vertical' in label else 0.1 + label['pad-horizontal'] = label['pad-horizontal'] if 'pad-horizontal' in label else 0.1 + + # Option Overrides when using labels + options.linewidth = 0.0 + options.papersize = label['paper'] + if label['tab-only']: + options.tabs_only = True + if label['body-height'] < 4.0: + options.text_front = "blank" + options.text_back = "blank" + if label['body-height'] < 1.0: + options.count = False + options.types = False + options.label = label + return options @@ -648,6 +697,17 @@ def read_card_data(options): # Add the new dividers cards.extend(new_cards) + # Add any blank cards + if options.include_blanks > 0: + for x in range(0, options.include_blanks): + c = Card(card_tag=u'Blank', + cardset='extras', + cardset_tag='extras', + cardset_tags=['extras'], + randomizer=False, + types=("Blank", )) + cards.append(c) + # Create Start Deck dividers. 4 sets. Adjust totals for other cards, too. # Do early before propagating to various sets. # The card database contains one prototype divider that needs to be either duplicated or deleted. @@ -922,6 +982,11 @@ def filter_sort_cards(cards, options): if options.expansions: options.expansions.append("extras") + # Take care of any blank cards + if options.include_blanks > 0: + if options.expansions: + options.expansions.append("extras") + # FIX THIS: Combine all Prizes across all expansions # if options.exclude_prizes: # cards = combine_cards(cards, 'Prize', 'prizes') @@ -1104,7 +1169,7 @@ def filter_sort_cards(cards, options): cardnamesByExpansion = defaultdict(dict) randomizerCountByExpansion = Counter() for c in cards: - if cardSorter.isBaseExpansionCard(c): + if cardSorter.isBaseExpansionCard(c) or c.isBlank(): continue if c.randomizer: randomizerCountByExpansion[c.cardset] += 1 @@ -1184,15 +1249,19 @@ def calculate_layout(options, cards=[]): options.tab_name_align = "left" fixedMargins = False - if options.tabs_only: - # fixed for Avery 8867 for now - minmarginwidth = 0.86 * cm # was 0.76 - minmarginheight = 1.37 * cm # was 1.27 - labelHeight = 1.07 * cm # was 1.27 - labelWidth = 4.24 * cm # was 4.44 - horizontalBorderSpace = 0.96 * cm # was 0.76 - verticalBorderSpace = 0.20 * cm # was 0.01 - dividerBaseHeight = 0 + options.label = options.label if 'label' in options else None + if options.label is not None: + # Set Margins + minmarginheight = (options.label['margin-top'] + options.label['pad-vertical']) * cm + minmarginwidth = (options.label['margin-left'] + options.label['pad-horizontal']) * cm + # Set Label size + labelHeight = (options.label['height'] - 2 * options.label['pad-vertical']) * cm + labelWidth = (options.label['width'] - 2 * options.label['pad-horizontal']) * cm + # Set spacing between labels + verticalBorderSpace = (options.label['gap-vertical'] + 2 * options.label['pad-vertical']) * cm + horizontalBorderSpace = (options.label['gap-horizontal'] + 2 * options.label['pad-horizontal']) * cm + # Fix up other settings + dividerBaseHeight = options.label['body-height'] * cm dividerWidth = labelWidth fixedMargins = True else: diff --git a/domdiv/tests/carddb_tests.py b/domdiv/tests/carddb_tests.py index ed7982a..44dac05 100644 --- a/domdiv/tests/carddb_tests.py +++ b/domdiv/tests/carddb_tests.py @@ -61,11 +61,16 @@ def test_cardread(): assert c.cardset_tag in valid_cardsets # Option modified card count - options = main.parse_opts(['--no-trash', '--curse10', '--start-decks']) + options = main.parse_opts(['--no-trash', '--curse10', '--start-decks', '--include-blanks', '7']) + options = main.clean_opts(options) options.data_path = '.' cards = main.read_card_data(options) - # Total delta cards is +21 from Trash: -1 * 3 sets = -3; Curse: +2 * 4 sets =+8; Start Decks: +4 * 4 sets = +16 - assert len(cards) == cardsExpected + 21 + # Total delta cards is +28 from + # Trash: -1 * 3 sets = -3 + # Curse: +2 * 4 sets = +8 + # Start Decks: +4 * 4 sets = +16 + # Blanks: +7 = +7 + assert len(cards) == cardsExpected + 28 def test_languages(): diff --git a/tools/update_language.py b/tools/update_language.py index d4492ce..b480dee 100644 --- a/tools/update_language.py +++ b/tools/update_language.py @@ -124,6 +124,32 @@ def main(args): print(type_parts) print() + ########################################################################### + # Get the labels_db information + # Store in a list in the order found. + ########################################################################### + all_labels = [] + + # Get the card data + label_data = get_json_data(os.path.join(args.card_db_dir, "labels_db.json")) + + with io.open( + os.path.join(args.output_dir, "labels_db.json"), 'w', + encoding='utf-8') as lang_out: + lang_out.write(six.u("[")) # Start of list + sep = "" + for label in label_data: + # Collect all the individual types + all_labels = list(set(label['names']) | set(all_labels)) + lang_out.write(sep + json.dumps( + label, indent=4, ensure_ascii=False, sort_keys=True)) + sep = "," + lang_out.write(six.u("\n]\n")) # End of List + + all_labels.sort() + print("Labels: ") + print(all_labels) + print() ########################################################################### # Fix up all the xx/types_xx.json files # Place entries in alphabetical order