def text_unpass_1_choice(s, delimit=False):
    choice_regex = (re.escape(choice_open_delimiter) +
                    re.escape(unary_marker) + r'.*' +
                    re.escape(bullet_marker) + r'.*' +
                    re.escape(choice_close_delimiter))
    choices = re.findall(choice_regex, s)
    for choice in sorted(choices,
                         lambda x, y: cmp(len(x), len(y)),
                         reverse=True):
        fragments = choice[1:-1].split(bullet_marker)
        countfrag = fragments[0]
        optfrags = fragments[1:]
        choicecount = int(
            utils.from_unary(
                re.findall(utils.number_unary_regex, countfrag)[0]))
        newchoice = ''

        if choicecount == 0:
            if len(countfrag) == 2:
                newchoice += 'choose one or both '
            else:
                newchoice += 'choose one or more '
        elif choicecount == 1:
            newchoice += 'choose one '
        elif choicecount == 2:
            newchoice += 'choose two '
        else:
            newchoice += 'choose ' + utils.to_unary(str(choicecount)) + ' '
        newchoice += dash_marker

        for option in optfrags:
            option = option.strip()
            if option:
                newchoice += newline + bullet_marker + ' ' + option

        if delimit:
            s = s.replace(
                choice,
                choice_open_delimiter + newchoice + choice_close_delimiter)
            s = s.replace('an opponent ' + choice_open_delimiter + 'choose ',
                          'an opponent ' + choice_open_delimiter + 'chooses ')
        else:
            s = s.replace(choice, newchoice)
            s = s.replace('an opponent choose ', 'an opponent chooses ')

    return s
Example #2
0
def text_unpass_1_choice(s, delimit = False):
    choice_regex = (re.escape(choice_open_delimiter) + re.escape(unary_marker)
                    + r'.*' + re.escape(bullet_marker) + r'.*' + re.escape(choice_close_delimiter))
    choices = re.findall(choice_regex, s)
    for choice in sorted(choices, lambda x,y: cmp(len(x), len(y)), reverse = True):
        fragments = choice[1:-1].split(bullet_marker)
        countfrag = fragments[0]
        optfrags = fragments[1:]
        choicecount = int(utils.from_unary(re.findall(utils.number_unary_regex, countfrag)[0]))
        newchoice = ''

        if choicecount == 0:
            if len(countfrag) == 2:
                newchoice += 'choose one or both '
            else:
                newchoice += 'choose one or more '
        elif choicecount == 1:
            newchoice += 'choose one '
        elif choicecount == 2:
            newchoice += 'choose two '
        else:
            newchoice += 'choose ' + utils.to_unary(str(choicecount)) + ' '
        newchoice += dash_marker
        
        for option in optfrags:
            option = option.strip()
            if option:
                newchoice += newline + bullet_marker + ' ' + option

        if delimit:
            s = s.replace(choice, choice_open_delimiter + newchoice + choice_close_delimiter)
            s = s.replace('an opponent ' + choice_open_delimiter + 'choose ', 
                          'an opponent ' + choice_open_delimiter + 'chooses ')
        else:
            s = s.replace(choice, newchoice)
            s = s.replace('an opponent choose ', 'an opponent chooses ')
    
    return s
Example #3
0
    def to_mse(self, print_raw = False, vdump = False):
        outstr = ''

        # need a 'card' string first
        outstr += 'card:\n'

        cardname = titlecase(transforms.name_unpass_1_dashes(self.__dict__[field_name]))
        outstr += '\tname: ' + cardname + '\n'

        if self.__dict__[field_rarity]:
            if self.__dict__[field_rarity] in utils.json_rarity_unmap:
                rarity = utils.json_rarity_unmap[self.__dict__[field_rarity]]
            else:
                rarity = self.__dict__[field_rarity]
            outstr += '\trarity: ' + rarity.lower() + '\n'

        if not self.__dict__[field_cost].none:            
            outstr += ('\tcasting cost: ' 
                       + self.__dict__[field_cost].format().replace('{','').replace('}','') 
                       + '\n')

        outstr += '\tsuper type: ' + ' '.join(self.__dict__[field_supertypes] 
                                              + self.__dict__[field_types]).title() + '\n'
        if self.__dict__[field_subtypes]:
            outstr += '\tsub type: ' + ' '.join(self.__dict__[field_subtypes]).title() + '\n'

        if self.__dict__[field_pt]:
            ptstring = utils.from_unary(self.__dict__[field_pt]).split('/')
            if (len(ptstring) > 1): # really don't want to be accessing anything nonexistent.
                outstr += '\tpower: ' + ptstring[0] + '\n'
                outstr += '\ttoughness: ' + ptstring[1] + '\n'

        if self.__dict__[field_text].text:
            mtext = self.__dict__[field_text].text
            mtext = transforms.text_unpass_1_choice(mtext, delimit = False)
            mtext = transforms.text_unpass_2_counters(mtext)
            mtext = transforms.text_unpass_3_uncast(mtext)
            mtext = transforms.text_unpass_4_unary(mtext)
            mtext = transforms.text_unpass_5_symbols(mtext, False)
            mtext = sentencecase(mtext)
            # I don't really want these MSE specific passes in transforms,
            # but they could be pulled out separately somewhere else in here.
            mtext = mtext.replace(utils.this_marker, '<atom-cardname><nospellcheck>'
                                  + utils.this_marker + '</nospellcheck></atom-cardname>')
            mtext = transforms.text_unpass_6_cardname(mtext, cardname)
            mtext = transforms.text_unpass_7_newlines(mtext)
            mtext = transforms.text_unpass_8_unicode(mtext)
            newtext = Manatext('')
            newtext.text = mtext
            newtext.costs = self.__dict__[field_text].costs
            newtext = newtext.format()

            # See, the thing is, I think it's simplest and easiest to just leave it like this.
            # What could possibly go wrong?
            newtext = newtext.replace('{','<sym-auto>').replace('}','</sym-auto>')
        else:
            newtext = ''

        # Annoying special case for bsides;
        # This could be improved by having an intermediate function that returned
        # all of the formatted fields in a data structure and a separate wrapper
        # that actually packed them into the MSE format.
        if self.bside:
            newtext = newtext.replace('\n','\n\t\t')
            outstr += '\trule text:\n\t\t' + newtext + '\n'

            outstr += '\tstylesheet: new-split\n'

            cardname2 = titlecase(transforms.name_unpass_1_dashes(
                self.bside.__dict__[field_name]))

            outstr += '\tname 2: ' + cardname2 + '\n'
            if self.bside.__dict__[field_rarity]:
                if self.bside.__dict__[field_rarity] in utils.json_rarity_unmap:
                    rarity2 = utils.json_rarity_unmap[self.bside.__dict__[field_rarity]]
                else:
                    rarity2 = self.bside.__dict__[field_rarity]
                outstr += '\trarity 2: ' + rarity2.lower() + '\n'

            if not self.bside.__dict__[field_cost].none:            
                outstr += ('\tcasting cost 2: ' 
                           + self.bside.__dict__[field_cost].format()
                           .replace('{','').replace('}','')
                           + '\n')

            outstr += ('\tsuper type 2: ' 
                       + ' '.join(self.bside.__dict__[field_supertypes] 
                                  + self.bside.__dict__[field_types]).title() + '\n')

            if self.bside.__dict__[field_subtypes]:
                outstr += ('\tsub type 2: ' 
                           + ' '.join(self.bside.__dict__[field_subtypes]).title() + '\n')

            if self.bside.__dict__[field_pt]:
                ptstring2 = utils.from_unary(self.bside.__dict__[field_pt]).split('/')
                if (len(ptstring2) > 1): # really don't want to be accessing anything nonexistent.
                    outstr += '\tpower 2: ' + ptstring2[0] + '\n'
                    outstr += '\ttoughness 2: ' + ptstring2[1] + '\n'

            if self.bside.__dict__[field_text].text:
                mtext2 = self.bside.__dict__[field_text].text
                mtext2 = transforms.text_unpass_1_choice(mtext2, delimit = False)
                mtext2 = transforms.text_unpass_2_counters(mtext2)
                mtext2 = transforms.text_unpass_3_uncast(mtext2)
                mtext2 = transforms.text_unpass_4_unary(mtext2)
                mtext2 = transforms.text_unpass_5_symbols(mtext2, False)
                mtext2 = sentencecase(mtext2)
                mtext2 = mtext2.replace(utils.this_marker, '<atom-cardname><nospellcheck>'
                                      + utils.this_marker + '</nospellcheck></atom-cardname>')
                mtext2 = transforms.text_unpass_6_cardname(mtext2, cardname2)
                mtext2 = transforms.text_unpass_7_newlines(mtext2)
                mtext2 = transforms.text_unpass_8_unicode(mtext2)
                newtext2 = Manatext('')
                newtext2.text = mtext2
                newtext2.costs = self.bside.__dict__[field_text].costs
                newtext2 = newtext2.format()
                newtext2 = newtext2.replace('{','<sym-auto>').replace('}','</sym-auto>')
                newtext2 = newtext2.replace('\n','\n\t\t')
                outstr += '\trule text 2:\n\t\t' + newtext2 + '\n'

        # Need to do Special Things if it's a planeswalker.
        # This code mostly works, but it won't get quite the right thing if the planeswalker
        # abilities don't come before any other ones. Should be fixed.
        elif "planeswalker" in str(self.__dict__[field_types]):
            outstr += '\tstylesheet: m15-planeswalker\n'

            # set up the loyalty cost fields using regex to find how many there are.
            i = 0
            lcost_regex = r'[-+]?\d+: ' # 1+ figures, might be 0.
            for lcost in re.findall(lcost_regex, newtext):
                i += 1
                outstr += '\tloyalty cost ' + str(i) + ': ' + lcost + '\n'
            # sub out the loyalty costs.
            newtext = re.sub(lcost_regex, '', newtext)

            # We need to uppercase again, because MSE won't magically capitalize for us
            # like it does after semicolons.
            # Abusing passes like this is terrible, should really fix sentencecase.
            newtext = transforms.text_pass_9_newlines(newtext)
            newtext = sentencecase(newtext)
            newtext = transforms.text_unpass_7_newlines(newtext)

            if self.__dict__[field_loyalty]:
                outstr += '\tloyalty: ' + utils.from_unary(self.__dict__[field_loyalty]) + '\n'

            newtext = newtext.replace('\n','\n\t\t')
            outstr += '\trule text:\n\t\t' + newtext + '\n'

        else:
            newtext = newtext.replace('\n','\n\t\t')
            outstr += '\trule text:\n\t\t' + newtext + '\n'

        # now append all the other useless fields that the setfile expects.
        outstr += '\thas styling: false\n\ttime created:2015-07-20 22:53:07\n\ttime modified:2015-07-20 22:53:08\n\textra data:\n\timage:\n\tcard code text:\n\tcopyright:\n\timage 2:\n\tcopyright 2:\n\tnotes:'

        return outstr
Example #4
0
    def format(self, gatherer = False, for_forum = False, for_mse = False, vdump = False):
        outstr = ''
        if gatherer:
            cardname = titlecase(transforms.name_unpass_1_dashes(self.__dict__[field_name]))
            if vdump and not cardname:
                cardname = '_NONAME_'
            if for_forum:
                outstr += '[b]'
            outstr += cardname
            if for_forum:
                outstr += '[/b]'

            coststr = self.__dict__[field_cost].format(for_forum = for_forum)
            if vdump or not coststr == '_NOCOST_':
                outstr += ' ' + coststr

            if self.__dict__[field_rarity]:
                if self.__dict__[field_rarity] in utils.json_rarity_unmap:
                    rarity = utils.json_rarity_unmap[self.__dict__[field_rarity]]
                else:
                    rarity = self.__dict__[field_rarity]
                outstr += ' (' + rarity + ')'

            if vdump:
                if not self.parsed:
                    outstr += ' _UNPARSED_'
                if not self.valid:
                    outstr += ' _INVALID_'
                
            outstr += '\n'

            basetypes = map(str.capitalize, self.__dict__[field_types])
            if vdump and len(basetypes) < 1:
                basetypes = ['_NOTYPE_']
            
            outstr += ' '.join(map(str.capitalize, self.__dict__[field_supertypes]) + basetypes)

            if self.__dict__[field_subtypes]:
                outstr += (' ' + utils.dash_marker + ' ' + 
                           ' '.join(self.__dict__[field_subtypes]).title())

            if self.__dict__[field_pt]:
                outstr += ' (' + utils.from_unary(self.__dict__[field_pt]) + ')'

            if self.__dict__[field_loyalty]:
                outstr += ' ((' + utils.from_unary(self.__dict__[field_loyalty]) + '))'

            outstr += '\n'

            if self.__dict__[field_text].text:
                mtext = self.__dict__[field_text].text
                mtext = transforms.text_unpass_1_choice(mtext, delimit = False)
                mtext = transforms.text_unpass_2_counters(mtext)
                #mtext = transforms.text_unpass_3_uncast(mtext)
                mtext = transforms.text_unpass_4_unary(mtext)
                mtext = transforms.text_unpass_5_symbols(mtext, for_forum)
                mtext = sentencecase(mtext)
                mtext = transforms.text_unpass_6_cardname(mtext, cardname)
                mtext = transforms.text_unpass_7_newlines(mtext)
                #mtext = transforms.text_unpass_8_unicode(mtext)
                newtext = Manatext('')
                newtext.text = mtext
                newtext.costs = self.__dict__[field_text].costs
                outstr += newtext.format(for_forum = for_forum)
            
                outstr += '\n'

            if vdump and self.__dict__[field_other]:
                if for_forum:
                    outstr += '[i]'
                else:
                    outstr += utils.dash_marker * 2
                    outstr += '\n'
                for idx, value in self.__dict__[field_other]:
                    outstr += '<' + str(idx) + '> ' + str(value)
                    outstr += '\n'
                if for_forum:
                    outstr = outstr[:-1] # hack off the last newline
                    outstr += '[/i]'
                    outstr += '\n'

        else:
            cardname = self.__dict__[field_name]
            #cardname = transforms.name_unpass_1_dashes(self.__dict__[field_name])
            if vdump and not cardname:
                cardname = '_NONAME_'
            outstr += cardname
            if self.__dict__[field_rarity]:
                if self.__dict__[field_rarity] in utils.json_rarity_unmap:
                    rarity = utils.json_rarity_unmap[self.__dict__[field_rarity]]
                else:
                    rarity = self.__dict__[field_rarity]
                outstr += ' (' + rarity.lower() + ')'
            if vdump:
                if not self.parsed:
                    outstr += ' _UNPARSED_'
                if not self.valid:
                    outstr += ' _INVALID_'
            outstr += '\n'
            
            coststr = self.__dict__[field_cost].format(for_forum = for_forum)
            if vdump or not coststr == '_NOCOST_':
                outstr += coststr
                outstr += '\n'

            outstr += ' '.join(self.__dict__[field_supertypes] + self.__dict__[field_types])
            if self.__dict__[field_subtypes]:
                outstr += ' ' + utils.dash_marker + ' ' + ' '.join(self.__dict__[field_subtypes])
            outstr += '\n'
            
            if self.__dict__[field_text].text:
                mtext = self.__dict__[field_text].text
                mtext = transforms.text_unpass_1_choice(mtext, delimit = True)
                #mtext = transforms.text_unpass_2_counters(mtext)
                #mtext = transforms.text_unpass_3_uncast(mtext)
                mtext = transforms.text_unpass_4_unary(mtext)
                mtext = transforms.text_unpass_5_symbols(mtext, for_forum)
                #mtext = transforms.text_unpass_6_cardname(mtext, cardname)
                mtext = transforms.text_unpass_7_newlines(mtext)
                #mtext = transforms.text_unpass_8_unicode(mtext)
                newtext = Manatext('')
                newtext.text = mtext
                newtext.costs = self.__dict__[field_text].costs
                outstr += newtext.format(for_forum = for_forum) + '\n'

            if self.__dict__[field_pt]:
                outstr += '(' + utils.from_unary(self.__dict__[field_pt]) + ')'
                outstr += '\n'

            if self.__dict__[field_loyalty]:
                outstr += '((' + utils.from_unary(self.__dict__[field_loyalty]) + '))'
                outstr += '\n'
                
            if vdump and self.__dict__[field_other]:
                outstr += utils.dash_marker * 2
                outstr += '\n'
                for idx, value in self.__dict__[field_other]:
                    outstr += '<' + str(idx) + '> ' + str(value)
                    outstr += '\n'

        if self.bside:
            outstr += utils.dash_marker * 8 + '\n'
            outstr += self.bside.format(gatherer = gatherer, for_forum = for_forum)

        return outstr
 def outliers(self, hsize=10, vsize=10, dump_invalid=False):
     print '********************'
     print 'Overview of indices:'
     rows = [['Index Name', 'Keys', 'Total Members']]
     for index in self.indices:
         rows += [[
             index,
             len(self.indices[index]),
             index_size(self.indices[index])
         ]]
     printrows(padrows(rows))
     print '********************'
     if len(self.by_name) > 0:
         scardname = sorted(self.by_name,
                            lambda x, y: cmp(len(x), len(y)),
                            reverse=False)[0]
         print 'Shortest Cardname: (' + str(len(scardname)) + ')'
         print '  ' + scardname
         lcardname = sorted(self.by_name,
                            lambda x, y: cmp(len(x), len(y)),
                            reverse=True)[0]
         print 'Longest Cardname: (' + str(len(lcardname)) + ')'
         print '  ' + lcardname
         d = sorted(
             self.by_name,
             lambda x, y: cmp(len(self.by_name[x]), len(self.by_name[y])),
             reverse=True)
         rows = []
         for k in d[0:vsize]:
             if len(self.by_name[k]) > 1:
                 rows += [[k, len(self.by_name[k])]]
         if rows == []:
             print('No duplicated cardnames')
         else:
             print '-- Most duplicated names: --'
             printrows(padrows(rows))
     else:
         print 'No cards indexed by name?'
     print '--------------------'
     if len(self.by_type) > 0:
         ltypes = sorted(self.by_type,
                         lambda x, y: cmp(len(x), len(y)),
                         reverse=True)[0]
         print 'Longest card type: (' + str(len(ltypes)) + ')'
         print '  ' + ltypes
     else:
         print 'No cards indexed by type?'
     if len(self.by_subtype) > 0:
         lsubtypes = sorted(self.by_subtype,
                            lambda x, y: cmp(len(x), len(y)),
                            reverse=True)[0]
         print 'Longest subtype: (' + str(len(lsubtypes)) + ')'
         print '  ' + lsubtypes
     else:
         print 'No cards indexed by subtype?'
     if len(self.by_supertype) > 0:
         lsupertypes = sorted(self.by_supertype,
                              lambda x, y: cmp(len(x), len(y)),
                              reverse=True)[0]
         print 'Longest supertype: (' + str(len(lsupertypes)) + ')'
         print '  ' + lsupertypes
     else:
         print 'No cards indexed by supertype?'
     print '--------------------'
     if len(self.by_cost) > 0:
         lcost = sorted(self.by_cost,
                        lambda x, y: cmp(len(x), len(y)),
                        reverse=True)[0]
         print 'Longest mana cost: (' + str(len(lcost)) + ')'
         print '  ' + utils.from_mana(lcost)
         print '\n' + plimit(self.by_cost[lcost][0].encode()) + '\n'
     else:
         print 'No cards indexed by cost?'
     if len(self.by_cmc) > 0:
         lcmc = sorted(self.by_cmc, reverse=True)[0]
         print 'Largest cmc: (' + str(lcmc) + ')'
         print '  ' + str(self.by_cmc[lcmc][0].cost)
         print '\n' + plimit(self.by_cmc[lcmc][0].encode())
     else:
         print 'No cards indexed by cmc?'
     print '--------------------'
     if len(self.by_power) > 0:
         lpower = sorted(self.by_power,
                         lambda x, y: cmp(len(x), len(y)),
                         reverse=True)[0]
         print 'Largest creature power: ' + utils.from_unary(lpower)
         print '\n' + plimit(self.by_power[lpower][0].encode()) + '\n'
     else:
         print 'No cards indexed by power?'
     if len(self.by_toughness) > 0:
         ltoughness = sorted(self.by_toughness,
                             lambda x, y: cmp(len(x), len(y)),
                             reverse=True)[0]
         print 'Largest creature toughness: ' + utils.from_unary(ltoughness)
         print '\n' + plimit(self.by_toughness[ltoughness][0].encode())
     else:
         print 'No cards indexed by toughness?'
     print '--------------------'
     if len(self.by_textlines) > 0:
         llines = sorted(self.by_textlines, reverse=True)[0]
         print 'Most lines of text in a card: ' + str(llines)
         print '\n' + plimit(self.by_textlines[llines][0].encode()) + '\n'
     else:
         print 'No cards indexed by line count?'
     if len(self.by_textlen) > 0:
         ltext = sorted(self.by_textlen, reverse=True)[0]
         print 'Most chars in a card text: ' + str(ltext)
         print '\n' + plimit(self.by_textlen[ltext][0].encode())
     else:
         print 'No cards indexed by char count?'
     print '--------------------'
     print 'There were ' + str(len(self.invalid_cards)) + ' invalid cards.'
     if dump_invalid:
         for card in self.invalid_cards:
             print '\n' + repr(card.fields)
     elif len(self.invalid_cards) > 0:
         print 'Not summarizing.'
     print '--------------------'
     print 'There were ' + str(len(
         self.unparsed_cards)) + ' unparsed cards.'
     if dump_invalid:
         for card in self.unparsed_cards:
             print '\n' + repr(card.fields)
     elif len(self.unparsed_cards) > 0:
         print 'Not summarizing.'
     print '===================='
 def summarize(self, hsize=10, vsize=10, cmcsize=20):
     print '===================='
     print str(len(self.cards)) + ' valid cards, ' + str(
         len(self.invalid_cards)) + ' invalid cards.'
     print str(len(self.allcards)) + ' cards parsed, ' + str(
         len(self.unparsed_cards)) + ' failed to parse'
     print '--------------------'
     print str(len(self.by_name)) + ' unique card names'
     print '--------------------'
     print(
         str(len(self.by_color_inclusive)) +
         ' represented colors (including colorless as \'A\'), ' +
         str(len(self.by_color)) + ' combinations')
     print 'Breakdown by color:'
     rows = [self.by_color_inclusive.keys()]
     rows += [[len(self.by_color_inclusive[k]) for k in rows[0]]]
     printrows(padrows(rows))
     print 'Breakdown by number of colors:'
     rows = [self.by_color_count.keys()]
     rows += [[len(self.by_color_count[k]) for k in rows[0]]]
     printrows(padrows(rows))
     print '--------------------'
     print str(len(self.by_type_inclusive)) + ' unique card types, ' + str(
         len(self.by_type)) + ' combinations'
     print 'Breakdown by type:'
     d = sorted(self.by_type_inclusive,
                lambda x, y: cmp(len(self.by_type_inclusive[x]),
                                 len(self.by_type_inclusive[y])),
                reverse=True)
     rows = [[k for k in d[:hsize]]]
     rows += [[len(self.by_type_inclusive[k]) for k in rows[0]]]
     printrows(padrows(rows))
     print '--------------------'
     print(
         str(len(self.by_subtype_inclusive)) + ' unique subtypes, ' +
         str(len(self.by_subtype)) + ' combinations')
     print '-- Popular subtypes: --'
     d = sorted(self.by_subtype_inclusive,
                lambda x, y: cmp(len(self.by_subtype_inclusive[x]),
                                 len(self.by_subtype_inclusive[y])),
                reverse=True)
     rows = []
     for k in d[0:vsize]:
         rows += [[k, len(self.by_subtype_inclusive[k])]]
     printrows(padrows(rows))
     print '-- Top combinations: --'
     d = sorted(
         self.by_subtype,
         lambda x, y: cmp(len(self.by_subtype[x]), len(self.by_subtype[y])),
         reverse=True)
     rows = []
     for k in d[0:vsize]:
         rows += [[k, len(self.by_subtype[k])]]
     printrows(padrows(rows))
     print '--------------------'
     print(
         str(len(self.by_supertype_inclusive)) + ' unique supertypes, ' +
         str(len(self.by_supertype)) + ' combinations')
     print 'Breakdown by supertype:'
     d = sorted(self.by_supertype_inclusive,
                lambda x, y: cmp(len(self.by_supertype_inclusive[x]),
                                 len(self.by_supertype_inclusive[y])),
                reverse=True)
     rows = [[k for k in d[:hsize]]]
     rows += [[len(self.by_supertype_inclusive[k]) for k in rows[0]]]
     printrows(padrows(rows))
     print '--------------------'
     print str(len(self.by_cmc)) + ' different CMCs, ' + str(
         len(self.by_cost)) + ' unique mana costs'
     print 'Breakdown by CMC:'
     d = sorted(self.by_cmc, reverse=False)
     rows = [[k for k in d[:cmcsize]]]
     rows += [[len(self.by_cmc[k]) for k in rows[0]]]
     printrows(padrows(rows))
     print '-- Popular mana costs: --'
     d = sorted(
         self.by_cost,
         lambda x, y: cmp(len(self.by_cost[x]), len(self.by_cost[y])),
         reverse=True)
     rows = []
     for k in d[0:vsize]:
         rows += [[utils.from_mana(k), len(self.by_cost[k])]]
     printrows(padrows(rows))
     print '--------------------'
     print str(len(self.by_pt)) + ' unique p/t combinations'
     if len(self.by_power) > 0 and len(self.by_toughness) > 0:
         print('Largest power: ' + str(max(map(len, self.by_power)) - 1) +
               ', largest toughness: ' +
               str(max(map(len, self.by_toughness)) - 1))
     print '-- Popular p/t values: --'
     d = sorted(self.by_pt,
                lambda x, y: cmp(len(self.by_pt[x]), len(self.by_pt[y])),
                reverse=True)
     rows = []
     for k in d[0:vsize]:
         rows += [[utils.from_unary(k), len(self.by_pt[k])]]
     printrows(padrows(rows))
     print '--------------------'
     print 'Loyalty values:'
     d = sorted(
         self.by_loyalty,
         lambda x, y: cmp(len(self.by_loyalty[x]), len(self.by_loyalty[y])),
         reverse=True)
     rows = []
     for k in d[0:vsize]:
         rows += [[utils.from_unary(k), len(self.by_loyalty[k])]]
     printrows(padrows(rows))
     print '--------------------'
     if len(self.by_textlen) > 0 and len(self.by_textlines) > 0:
         print('Card text ranges from ' + str(min(self.by_textlen)) +
               ' to ' + str(max(self.by_textlen)) + ' characters in length')
         print('Card text ranges from ' + str(min(self.by_textlines)) +
               ' to ' + str(max(self.by_textlines)) + ' lines')
     print '-- Line counts by frequency: --'
     d = sorted(self.by_textlines,
                lambda x, y: cmp(len(self.by_textlines[x]),
                                 len(self.by_textlines[y])),
                reverse=True)
     rows = []
     for k in d[0:vsize]:
         rows += [[k, len(self.by_textlines[k])]]
     printrows(padrows(rows))
     print '===================='
Example #7
0
def text_unpass_4_unary(s):
    return utils.from_unary(s)
Example #8
0
    def to_mse(self, print_raw=False, vdump=False):
        outstr = ''

        # need a 'card' string first
        outstr += 'card:\n'

        cardname = titlecase(
            transforms.name_unpass_1_dashes(self.__dict__[field_name]))
        outstr += '\tname: ' + cardname + '\n'

        if self.__dict__[field_rarity]:
            if self.__dict__[field_rarity] in utils.json_rarity_unmap:
                rarity = utils.json_rarity_unmap[self.__dict__[field_rarity]]
            else:
                rarity = self.__dict__[field_rarity]
            outstr += '\trarity: ' + rarity.lower() + '\n'

        if not self.__dict__[field_cost].none:
            outstr += ('\tcasting cost: ' +
                       self.__dict__[field_cost].format().replace(
                           '{', '').replace('}', '') + '\n')

        outstr += '\tsuper type: ' + ' '.join(
            self.__dict__[field_supertypes] +
            self.__dict__[field_types]).title() + '\n'
        if self.__dict__[field_subtypes]:
            outstr += '\tsub type: ' + ' '.join(
                self.__dict__[field_subtypes]).title() + '\n'

        if self.__dict__[field_pt]:
            ptstring = utils.from_unary(self.__dict__[field_pt]).split('/')
            if (len(ptstring) > 1
                ):  # really don't want to be accessing anything nonexistent.
                outstr += '\tpower: ' + ptstring[0] + '\n'
                outstr += '\ttoughness: ' + ptstring[1] + '\n'

        if self.__dict__[field_text].text:
            mtext = self.__dict__[field_text].text
            mtext = transforms.text_unpass_1_choice(mtext, delimit=False)
            mtext = transforms.text_unpass_2_counters(mtext)
            mtext = transforms.text_unpass_3_uncast(mtext)
            mtext = transforms.text_unpass_4_unary(mtext)
            mtext = transforms.text_unpass_5_symbols(mtext, False, False)
            mtext = sentencecase(mtext)
            # I don't really want these MSE specific passes in transforms,
            # but they could be pulled out separately somewhere else in here.
            mtext = mtext.replace(
                utils.this_marker, '<atom-cardname><nospellcheck>' +
                utils.this_marker + '</nospellcheck></atom-cardname>')
            mtext = transforms.text_unpass_6_cardname(mtext, cardname)
            mtext = transforms.text_unpass_7_newlines(mtext)
            mtext = transforms.text_unpass_8_unicode(mtext)
            newtext = Manatext('')
            newtext.text = mtext
            newtext.costs = self.__dict__[field_text].costs
            newtext = newtext.format()

            # See, the thing is, I think it's simplest and easiest to just leave it like this.
            # What could possibly go wrong?
            newtext = newtext.replace('{', '<sym-auto>').replace(
                '}', '</sym-auto>')
        else:
            newtext = ''

        # Annoying special case for bsides;
        # This could be improved by having an intermediate function that returned
        # all of the formatted fields in a data structure and a separate wrapper
        # that actually packed them into the MSE format.
        if self.bside:
            newtext = newtext.replace('\n', '\n\t\t')
            outstr += '\trule text:\n\t\t' + newtext + '\n'

            outstr += '\tstylesheet: new-split\n'

            cardname2 = titlecase(
                transforms.name_unpass_1_dashes(
                    self.bside.__dict__[field_name]))

            outstr += '\tname 2: ' + cardname2 + '\n'
            if self.bside.__dict__[field_rarity]:
                if self.bside.__dict__[
                        field_rarity] in utils.json_rarity_unmap:
                    rarity2 = utils.json_rarity_unmap[
                        self.bside.__dict__[field_rarity]]
                else:
                    rarity2 = self.bside.__dict__[field_rarity]
                outstr += '\trarity 2: ' + rarity2.lower() + '\n'

            if not self.bside.__dict__[field_cost].none:
                outstr += ('\tcasting cost 2: ' +
                           self.bside.__dict__[field_cost].format().replace(
                               '{', '').replace('}', '') + '\n')

            outstr += ('\tsuper type 2: ' +
                       ' '.join(self.bside.__dict__[field_supertypes] +
                                self.bside.__dict__[field_types]).title() +
                       '\n')

            if self.bside.__dict__[field_subtypes]:
                outstr += ('\tsub type 2: ' + ' '.join(
                    self.bside.__dict__[field_subtypes]).title() + '\n')

            if self.bside.__dict__[field_pt]:
                ptstring2 = utils.from_unary(
                    self.bside.__dict__[field_pt]).split('/')
                if (
                        len(ptstring2) > 1
                ):  # really don't want to be accessing anything nonexistent.
                    outstr += '\tpower 2: ' + ptstring2[0] + '\n'
                    outstr += '\ttoughness 2: ' + ptstring2[1] + '\n'

            if self.bside.__dict__[field_text].text:
                mtext2 = self.bside.__dict__[field_text].text
                mtext2 = transforms.text_unpass_1_choice(mtext2, delimit=False)
                mtext2 = transforms.text_unpass_2_counters(mtext2)
                mtext2 = transforms.text_unpass_3_uncast(mtext2)
                mtext2 = transforms.text_unpass_4_unary(mtext2)
                mtext2 = transforms.text_unpass_5_symbols(mtext2, False, False)
                mtext2 = sentencecase(mtext2)
                mtext2 = mtext2.replace(
                    utils.this_marker, '<atom-cardname><nospellcheck>' +
                    utils.this_marker + '</nospellcheck></atom-cardname>')
                mtext2 = transforms.text_unpass_6_cardname(mtext2, cardname2)
                mtext2 = transforms.text_unpass_7_newlines(mtext2)
                mtext2 = transforms.text_unpass_8_unicode(mtext2)
                newtext2 = Manatext('')
                newtext2.text = mtext2
                newtext2.costs = self.bside.__dict__[field_text].costs
                newtext2 = newtext2.format()
                newtext2 = newtext2.replace('{', '<sym-auto>').replace(
                    '}', '</sym-auto>')
                newtext2 = newtext2.replace('\n', '\n\t\t')
                outstr += '\trule text 2:\n\t\t' + newtext2 + '\n'

        # Need to do Special Things if it's a planeswalker.
        # This code mostly works, but it won't get quite the right thing if the planeswalker
        # abilities don't come before any other ones. Should be fixed.
        elif "planeswalker" in str(self.__dict__[field_types]):
            outstr += '\tstylesheet: m15-planeswalker\n'

            # set up the loyalty cost fields using regex to find how many there are.
            i = 0
            lcost_regex = r'[-+]?\d+: '  # 1+ figures, might be 0.
            for lcost in re.findall(lcost_regex, newtext):
                i += 1
                outstr += '\tloyalty cost ' + str(i) + ': ' + lcost + '\n'
            # sub out the loyalty costs.
            newtext = re.sub(lcost_regex, '', newtext)

            # We need to uppercase again, because MSE won't magically capitalize for us
            # like it does after semicolons.
            # Abusing passes like this is terrible, should really fix sentencecase.
            newtext = transforms.text_pass_9_newlines(newtext)
            newtext = sentencecase(newtext)
            newtext = transforms.text_unpass_7_newlines(newtext)

            if self.__dict__[field_loyalty]:
                outstr += '\tloyalty: ' + utils.from_unary(
                    self.__dict__[field_loyalty]) + '\n'

            newtext = newtext.replace('\n', '\n\t\t')
            outstr += '\trule text:\n\t\t' + newtext + '\n'

        else:
            newtext = newtext.replace('\n', '\n\t\t')
            outstr += '\trule text:\n\t\t' + newtext + '\n'

        # now append all the other useless fields that the setfile expects.
        outstr += '\thas styling: false\n\ttime created:2015-07-20 22:53:07\n\ttime modified:2015-07-20 22:53:08\n\textra data:\n\timage:\n\tcard code text:\n\tcopyright:\n\timage 2:\n\tcopyright 2:\n\tnotes:'

        return outstr
Example #9
0
    def format(self,
               gatherer=False,
               for_forum=False,
               vdump=False,
               for_html=False):
        linebreak = '\n'
        if for_html:
            linebreak = '<hr>' + linebreak

        outstr = ''
        if for_html:
            outstr += '<div class="card-text">\n'

        if gatherer:
            cardname = titlecase(
                transforms.name_unpass_1_dashes(self.__dict__[field_name]))
            if vdump and not cardname:
                cardname = '_NONAME_'
            # in general, for_html overrides for_forum
            if for_html:
                outstr += '<b>'
            elif for_forum:
                outstr += '[b]'
            outstr += cardname
            if for_html:
                outstr += '</b>'
            elif for_forum:
                outstr += '[/b]'

            coststr = self.__dict__[field_cost].format(for_forum=for_forum,
                                                       for_html=for_html)
            if vdump or not coststr == '_NOCOST_':
                outstr += ' ' + coststr

            if for_html and for_forum:
                #force for_html to false to create tootip with forum spoiler
                outstr += (
                    '<div class="hover_img"><a href="#">[F]</a> <span><p>' +
                    self.format(gatherer=gatherer,
                                for_forum=for_forum,
                                for_html=False,
                                vdump=vdump).replace('\n', '<br>') +
                    '</p></span></div><a href="#top" style="float: right;">back to top</a>'
                )

            if self.__dict__[field_rarity]:
                if self.__dict__[field_rarity] in utils.json_rarity_unmap:
                    rarity = utils.json_rarity_unmap[
                        self.__dict__[field_rarity]]
                else:
                    rarity = self.__dict__[field_rarity]
                outstr += ' (' + rarity + ')'

            if vdump:
                if not self.parsed:
                    outstr += ' _UNPARSED_'
                if not self.valid:
                    outstr += ' _INVALID_'

            outstr += linebreak

            basetypes = map(str.capitalize, self.__dict__[field_types])
            if vdump and len(basetypes) < 1:
                basetypes = ['_NOTYPE_']

            outstr += ' '.join(
                map(str.capitalize, self.__dict__[field_supertypes]) +
                basetypes)

            if self.__dict__[field_subtypes]:
                outstr += (' ' + utils.dash_marker + ' ' +
                           ' '.join(self.__dict__[field_subtypes]).title())

            if self.__dict__[field_pt]:
                outstr += ' (' + utils.from_unary(
                    self.__dict__[field_pt]) + ')'

            if self.__dict__[field_loyalty]:
                outstr += ' ((' + utils.from_unary(
                    self.__dict__[field_loyalty]) + '))'

            if self.__dict__[field_text].text:
                outstr += linebreak

                mtext = self.__dict__[field_text].text
                mtext = transforms.text_unpass_1_choice(mtext, delimit=False)
                mtext = transforms.text_unpass_2_counters(mtext)
                #mtext = transforms.text_unpass_3_uncast(mtext)
                mtext = transforms.text_unpass_4_unary(mtext)
                mtext = transforms.text_unpass_5_symbols(
                    mtext, for_forum, for_html)
                mtext = sentencecase(mtext)
                mtext = transforms.text_unpass_6_cardname(mtext, cardname)
                mtext = transforms.text_unpass_7_newlines(mtext)
                #mtext = transforms.text_unpass_8_unicode(mtext)
                newtext = Manatext('')
                newtext.text = mtext
                newtext.costs = self.__dict__[field_text].costs

                outstr += newtext.format(for_forum=for_forum,
                                         for_html=for_html)

            if vdump and self.__dict__[field_other]:
                outstr += linebreak

                if for_html:
                    outstr += '<i>'
                elif for_forum:
                    outstr += '[i]'
                else:
                    outstr += utils.dash_marker * 2

                first = True
                for idx, value in self.__dict__[field_other]:
                    if for_html:
                        if not first:
                            outstr += '<br>\n'
                        else:
                            first = False
                    else:
                        outstr += linebreak
                    outstr += '(' + str(idx) + ') ' + str(value)

                if for_html:
                    outstr += '</i>'
                if for_forum:
                    outstr += '[/i]'

        else:
            cardname = self.__dict__[field_name]
            #cardname = transforms.name_unpass_1_dashes(self.__dict__[field_name])
            if vdump and not cardname:
                cardname = '_NONAME_'
            outstr += cardname

            coststr = self.__dict__[field_cost].format(for_forum=for_forum,
                                                       for_html=for_html)
            if vdump or not coststr == '_NOCOST_':
                outstr += ' ' + coststr

            if vdump:
                if not self.parsed:
                    outstr += ' _UNPARSED_'
                if not self.valid:
                    outstr += ' _INVALID_'

            if for_html and for_forum:
                #force for_html to false to create tootip with forum spoiler
                outstr += (
                    '<div class="hover_img"><a href="#">[F]</a> <span><p>' +
                    self.format(gatherer=gatherer,
                                for_forum=for_forum,
                                for_html=False,
                                vdump=vdump).replace('\n', '<br>') +
                    '</p></span></div><a href="#top" style="float: right;">back to top</a>'
                )

            outstr += linebreak

            outstr += ' '.join(self.__dict__[field_supertypes] +
                               self.__dict__[field_types])
            if self.__dict__[field_subtypes]:
                outstr += ' ' + utils.dash_marker + ' ' + ' '.join(
                    self.__dict__[field_subtypes])

            if self.__dict__[field_rarity]:
                if self.__dict__[field_rarity] in utils.json_rarity_unmap:
                    rarity = utils.json_rarity_unmap[
                        self.__dict__[field_rarity]]
                else:
                    rarity = self.__dict__[field_rarity]
                outstr += ' (' + rarity.lower() + ')'

            if self.__dict__[field_text].text:
                outstr += linebreak

                mtext = self.__dict__[field_text].text
                mtext = transforms.text_unpass_1_choice(mtext, delimit=True)
                #mtext = transforms.text_unpass_2_counters(mtext)
                #mtext = transforms.text_unpass_3_uncast(mtext)
                mtext = transforms.text_unpass_4_unary(mtext)
                mtext = transforms.text_unpass_5_symbols(
                    mtext, for_forum, for_html)
                #mtext = transforms.text_unpass_6_cardname(mtext, cardname)
                mtext = transforms.text_unpass_7_newlines(mtext)
                #mtext = transforms.text_unpass_8_unicode(mtext)
                newtext = Manatext('')
                newtext.text = mtext
                newtext.costs = self.__dict__[field_text].costs

                outstr += newtext.format(for_forum=for_forum,
                                         for_html=for_html)

            if self.__dict__[field_pt]:
                outstr += linebreak
                outstr += '(' + utils.from_unary(self.__dict__[field_pt]) + ')'

            if self.__dict__[field_loyalty]:
                outstr += linebreak
                outstr += '((' + utils.from_unary(
                    self.__dict__[field_loyalty]) + '))'

            if vdump and self.__dict__[field_other]:
                outstr += linebreak

                if for_html:
                    outstr += '<i>'
                else:
                    outstr += utils.dash_marker * 2

                first = True
                for idx, value in self.__dict__[field_other]:
                    if for_html:
                        if not first:
                            outstr += '<br>\n'
                        else:
                            first = False
                    else:
                        outstr += linebreak
                    outstr += '(' + str(idx) + ') ' + str(value)

                if for_html:
                    outstr += '</i>'

        if self.bside:
            if for_html:
                outstr += '\n'
                # force for_forum to false so that the inner div doesn't duplicate the forum
                # spoiler of the bside
                outstr += self.bside.format(gatherer=gatherer,
                                            for_forum=False,
                                            for_html=for_html,
                                            vdump=vdump)
            else:
                outstr += linebreak
                outstr += utils.dash_marker * 8
                outstr += linebreak
                outstr += self.bside.format(gatherer=gatherer,
                                            for_forum=for_forum,
                                            for_html=for_html,
                                            vdump=vdump)

        # if for_html:
        #     if for_forum:
        #         outstr += linebreak
        #         # force for_html to false to create a copyable forum spoiler div
        #         outstr += ('<div>'
        #                    + self.format(gatherer=gatherer, for_forum=for_forum, for_html=False, vdump=vdump).replace('\n', '<br>')
        #                    + '</div>')
        if for_html:
            outstr += "</div>"

        return outstr
Example #10
0
    def format(self, gatherer = False, for_forum = False, vdump = False, for_html = False):
        linebreak = '\n'
        if for_html:
            linebreak = '<hr>' + linebreak

        outstr = ''
        if for_html:
            outstr += '<div class="card-text">\n'

        if gatherer:
            cardname = titlecase(transforms.name_unpass_1_dashes(self.__dict__[field_name]))
            if vdump and not cardname:
                cardname = '_NONAME_'
            # in general, for_html overrides for_forum
            if for_html: 
                outstr += '<b>'
            elif for_forum:
                outstr += '[b]'
            outstr += cardname
            if for_html: 
                outstr += '</b>'
            elif for_forum:
                outstr += '[/b]'

            coststr = self.__dict__[field_cost].format(for_forum=for_forum, for_html=for_html)
            if vdump or not coststr == '_NOCOST_':
                outstr += ' ' + coststr

            if self.__dict__[field_rarity]:
                if self.__dict__[field_rarity] in utils.json_rarity_unmap:
                    rarity = utils.json_rarity_unmap[self.__dict__[field_rarity]]
                else:
                    rarity = self.__dict__[field_rarity]
                outstr += ' (' + rarity + ')'

            if vdump:
                if not self.parsed:
                    outstr += ' _UNPARSED_'
                if not self.valid:
                    outstr += ' _INVALID_'
                
            outstr += linebreak

            basetypes = map(str.capitalize, self.__dict__[field_types])
            if vdump and len(basetypes) < 1:
                basetypes = ['_NOTYPE_']
            
            outstr += ' '.join(map(str.capitalize, self.__dict__[field_supertypes]) + basetypes)

            if self.__dict__[field_subtypes]:
                outstr += (' ' + utils.dash_marker + ' ' + 
                           ' '.join(self.__dict__[field_subtypes]).title())

            if self.__dict__[field_pt]:
                outstr += ' (' + utils.from_unary(self.__dict__[field_pt]) + ')'

            if self.__dict__[field_loyalty]:
                outstr += ' ((' + utils.from_unary(self.__dict__[field_loyalty]) + '))'

            if self.__dict__[field_text].text:
                outstr += linebreak

                mtext = self.__dict__[field_text].text
                mtext = transforms.text_unpass_1_choice(mtext, delimit = False)
                mtext = transforms.text_unpass_2_counters(mtext)
                #mtext = transforms.text_unpass_3_uncast(mtext)
                mtext = transforms.text_unpass_4_unary(mtext)
                mtext = transforms.text_unpass_5_symbols(mtext, for_forum, for_html)
                mtext = sentencecase(mtext)
                mtext = transforms.text_unpass_6_cardname(mtext, cardname)
                mtext = transforms.text_unpass_7_newlines(mtext)
                #mtext = transforms.text_unpass_8_unicode(mtext)
                newtext = Manatext('')
                newtext.text = mtext
                newtext.costs = self.__dict__[field_text].costs

                outstr += newtext.format(for_forum = for_forum, for_html = for_html)
            
            if vdump and self.__dict__[field_other]:
                outstr += linebreak

                if for_html:
                    outstr += '<i>'
                elif for_forum:
                    outstr += '[i]'
                else:
                    outstr += utils.dash_marker * 2

                first = True
                for idx, value in self.__dict__[field_other]:
                    if for_html:
                        if not first:
                            outstr += '<br>\n'
                        else:
                            first = False
                    else:
                        outstr += linebreak
                    outstr += '(' + str(idx) + ') ' + str(value)
                    
                if for_html:
                    outstr += '</i>'
                if for_forum:
                    outstr += '[/i]'

        else:
            cardname = self.__dict__[field_name]
            #cardname = transforms.name_unpass_1_dashes(self.__dict__[field_name])
            if vdump and not cardname:
                cardname = '_NONAME_'
            outstr += cardname

            coststr = self.__dict__[field_cost].format(for_forum=for_forum, for_html=for_html)
            if vdump or not coststr == '_NOCOST_':
                outstr += ' ' + coststr

            if vdump:
                if not self.parsed:
                    outstr += ' _UNPARSED_'
                if not self.valid:
                    outstr += ' _INVALID_'
            
            outstr += linebreak

            outstr += ' '.join(self.__dict__[field_supertypes] + self.__dict__[field_types])
            if self.__dict__[field_subtypes]:
                outstr += ' ' + utils.dash_marker + ' ' + ' '.join(self.__dict__[field_subtypes])

            if self.__dict__[field_rarity]:
                if self.__dict__[field_rarity] in utils.json_rarity_unmap:
                    rarity = utils.json_rarity_unmap[self.__dict__[field_rarity]]
                else:
                    rarity = self.__dict__[field_rarity]
                outstr += ' (' + rarity.lower() + ')'
            
            if self.__dict__[field_text].text:
                outstr += linebreak

                mtext = self.__dict__[field_text].text
                mtext = transforms.text_unpass_1_choice(mtext, delimit = True)
                #mtext = transforms.text_unpass_2_counters(mtext)
                #mtext = transforms.text_unpass_3_uncast(mtext)
                mtext = transforms.text_unpass_4_unary(mtext)
                mtext = transforms.text_unpass_5_symbols(mtext, for_forum, for_html)
                #mtext = transforms.text_unpass_6_cardname(mtext, cardname)
                mtext = transforms.text_unpass_7_newlines(mtext)
                #mtext = transforms.text_unpass_8_unicode(mtext)
                newtext = Manatext('')
                newtext.text = mtext
                newtext.costs = self.__dict__[field_text].costs

                outstr += newtext.format(for_forum=for_forum, for_html=for_html)

            if self.__dict__[field_pt]:
                outstr += linebreak
                outstr += '(' + utils.from_unary(self.__dict__[field_pt]) + ')'

            if self.__dict__[field_loyalty]:
                outstr += linebreak
                outstr += '((' + utils.from_unary(self.__dict__[field_loyalty]) + '))'
                
            if vdump and self.__dict__[field_other]:
                outstr += linebreak

                if for_html:
                    outstr += '<i>'
                else:
                    outstr += utils.dash_marker * 2

                first = True
                for idx, value in self.__dict__[field_other]:
                    if for_html:
                        if not first:
                            outstr += '<br>\n'
                        else:
                            first = False
                    else:
                        outstr += linebreak
                    outstr += '(' + str(idx) + ') ' + str(value)

                if for_html:
                    outstr += '</i>'

        if self.bside:
            if for_html:
                outstr += '\n'
                # force for_forum to false so that the inner div doesn't duplicate the forum
                # spoiler of the bside
                outstr += self.bside.format(gatherer=gatherer, for_forum=False, for_html=for_html, vdump=vdump)
            else:
                outstr += linebreak
                outstr += utils.dash_marker * 8
                outstr += linebreak
                outstr += self.bside.format(gatherer=gatherer, for_forum=for_forum, for_html=for_html, vdump=vdump)

        if for_html:
            if for_forum:
                outstr += linebreak
                # force for_html to false to create a copyable forum spoiler div
                outstr += ('<div>' 
                           + self.format(gatherer=gatherer, for_forum=for_forum, for_html=False, vdump=vdump).replace('\n', '<br>')
                           + '</div>')
            outstr += "</div>"

        return outstr
Example #11
0
    def format(self, gatherer=False, for_forum=False, for_mse=False, vdump=False):
        outstr = ""
        if gatherer:
            cardname = titlecase(transforms.name_unpass_1_dashes(self.__dict__[field_name]))
            if vdump and not cardname:
                cardname = "_NONAME_"
            if for_forum:
                outstr += "[b]"
            outstr += cardname
            if for_forum:
                outstr += "[/b]"

            coststr = self.__dict__[field_cost].format(for_forum=for_forum)
            if vdump or not coststr == "_NOCOST_":
                outstr += " " + coststr

            if self.__dict__[field_rarity]:
                if self.__dict__[field_rarity] in utils.json_rarity_unmap:
                    rarity = utils.json_rarity_unmap[self.__dict__[field_rarity]]
                else:
                    rarity = self.__dict__[field_rarity]
                outstr += " (" + rarity + ")"

            if vdump:
                if not self.parsed:
                    outstr += " _UNPARSED_"
                if not self.valid:
                    outstr += " _INVALID_"

            outstr += "\n"

            basetypes = map(str.capitalize, self.__dict__[field_types])
            if vdump and len(basetypes) < 1:
                basetypes = ["_NOTYPE_"]

            outstr += " ".join(map(str.capitalize, self.__dict__[field_supertypes]) + basetypes)

            if self.__dict__[field_subtypes]:
                outstr += " " + utils.dash_marker + " " + " ".join(self.__dict__[field_subtypes]).title()

            if self.__dict__[field_pt]:
                outstr += " (" + utils.from_unary(self.__dict__[field_pt]) + ")"

            if self.__dict__[field_loyalty]:
                outstr += " ((" + utils.from_unary(self.__dict__[field_loyalty]) + "))"

            outstr += "\n"

            if self.__dict__[field_text].text:
                mtext = self.__dict__[field_text].text
                mtext = transforms.text_unpass_1_choice(mtext, delimit=False)
                mtext = transforms.text_unpass_2_counters(mtext)
                # mtext = transforms.text_unpass_3_uncast(mtext)
                mtext = transforms.text_unpass_4_unary(mtext)
                mtext = transforms.text_unpass_5_symbols(mtext, for_forum)
                mtext = sentencecase(mtext)
                mtext = transforms.text_unpass_6_cardname(mtext, cardname)
                mtext = transforms.text_unpass_7_newlines(mtext)
                # mtext = transforms.text_unpass_8_unicode(mtext)
                newtext = Manatext("")
                newtext.text = mtext
                newtext.costs = self.__dict__[field_text].costs
                outstr += newtext.format(for_forum=for_forum)

                outstr += "\n"

            if vdump and self.__dict__[field_other]:
                if for_forum:
                    outstr += "[i]"
                else:
                    outstr += utils.dash_marker * 2
                    outstr += "\n"
                for idx, value in self.__dict__[field_other]:
                    outstr += "<" + str(idx) + "> " + str(value)
                    outstr += "\n"
                if for_forum:
                    outstr = outstr[:-1]  # hack off the last newline
                    outstr += "[/i]"
                    outstr += "\n"

        else:
            cardname = self.__dict__[field_name]
            # cardname = transforms.name_unpass_1_dashes(self.__dict__[field_name])
            if vdump and not cardname:
                cardname = "_NONAME_"
            outstr += cardname
            if self.__dict__[field_rarity]:
                if self.__dict__[field_rarity] in utils.json_rarity_unmap:
                    rarity = utils.json_rarity_unmap[self.__dict__[field_rarity]]
                else:
                    rarity = self.__dict__[field_rarity]
                outstr += " (" + rarity.lower() + ")"
            if vdump:
                if not self.parsed:
                    outstr += " _UNPARSED_"
                if not self.valid:
                    outstr += " _INVALID_"
            outstr += "\n"

            coststr = self.__dict__[field_cost].format(for_forum=for_forum)
            if vdump or not coststr == "_NOCOST_":
                outstr += coststr
                outstr += "\n"

            outstr += " ".join(self.__dict__[field_supertypes] + self.__dict__[field_types])
            if self.__dict__[field_subtypes]:
                outstr += " " + utils.dash_marker + " " + " ".join(self.__dict__[field_subtypes])
            outstr += "\n"

            if self.__dict__[field_text].text:
                mtext = self.__dict__[field_text].text
                mtext = transforms.text_unpass_1_choice(mtext, delimit=True)
                # mtext = transforms.text_unpass_2_counters(mtext)
                # mtext = transforms.text_unpass_3_uncast(mtext)
                mtext = transforms.text_unpass_4_unary(mtext)
                mtext = transforms.text_unpass_5_symbols(mtext, for_forum)
                # mtext = transforms.text_unpass_6_cardname(mtext, cardname)
                mtext = transforms.text_unpass_7_newlines(mtext)
                # mtext = transforms.text_unpass_8_unicode(mtext)
                newtext = Manatext("")
                newtext.text = mtext
                newtext.costs = self.__dict__[field_text].costs
                outstr += newtext.format(for_forum=for_forum) + "\n"

            if self.__dict__[field_pt]:
                outstr += "(" + utils.from_unary(self.__dict__[field_pt]) + ")"
                outstr += "\n"

            if self.__dict__[field_loyalty]:
                outstr += "((" + utils.from_unary(self.__dict__[field_loyalty]) + "))"
                outstr += "\n"

            if vdump and self.__dict__[field_other]:
                outstr += utils.dash_marker * 2
                outstr += "\n"
                for idx, value in self.__dict__[field_other]:
                    outstr += "<" + str(idx) + "> " + str(value)
                    outstr += "\n"

        if self.bside:
            outstr += utils.dash_marker * 8 + "\n"
            outstr += self.bside.format(gatherer=gatherer, for_forum=for_forum)

        return outstr
Example #12
0
    def format(self, gatherer=False, for_forum=False, vdump=False, for_html=False):
        linebreak = "\n"
        if for_html:
            linebreak = "<hr>" + linebreak

        outstr = ""
        if for_html:
            outstr += '<div class="card-text'
            if len(self.get_colors()) > 1:
                outstr += ' multi"'
            elif "R" in self.get_colors():
                outstr += ' red"'
            elif "U" in self.get_colors():
                outstr += ' blue"'
            elif "B" in self.get_colors():
                outstr += ' black"'
            elif "G" in self.get_colors():
                outstr += ' green"'
            elif "W" in self.get_colors():
                outstr += ' white"'
            elif "land" in self.get_types():
                outstr += ' land"'
            else:
                outstr += ' colorless"'
            outstr += ">\n"

        if gatherer:
            cardname = titlecase(transforms.name_unpass_1_dashes(self.__dict__[field_name]))
            if vdump and not cardname:
                cardname = "_NONAME_"
            # in general, for_html overrides for_forum
            if for_html:
                outstr += "<b>"
            elif for_forum:
                outstr += "[b]"
            outstr += cardname
            if for_html:
                outstr += "</b>"
            elif for_forum:
                outstr += "[/b]"

            coststr = self.__dict__[field_cost].format(for_forum=for_forum, for_html=for_html)
            if vdump or not coststr == "_NOCOST_":
                outstr += " " + coststr

            if for_html and for_forum:
                # force for_html to false to create tootip with forum spoiler
                outstr += (
                    '<div class="hover_img"><a href="#">[F]</a> <span><p>'
                    + self.format(gatherer=gatherer, for_forum=for_forum, for_html=False, vdump=vdump).replace(
                        "\n", "<br>"
                    )
                    + '</p></span></div><a href="#top" style="float: right;">back to top</a>'
                )

            if self.__dict__[field_rarity]:
                if self.__dict__[field_rarity] in utils.json_rarity_unmap:
                    rarity = utils.json_rarity_unmap[self.__dict__[field_rarity]]
                else:
                    rarity = self.__dict__[field_rarity]
                outstr += " (" + rarity + ")"

            if vdump:
                if not self.parsed:
                    outstr += " _UNPARSED_"
                if not self.valid:
                    outstr += " _INVALID_"

            outstr += linebreak

            basetypes = map(str.capitalize, self.__dict__[field_types])
            if vdump and len(basetypes) < 1:
                basetypes = ["_NOTYPE_"]

            outstr += " ".join(map(str.capitalize, self.__dict__[field_supertypes]) + basetypes)

            if self.__dict__[field_subtypes]:
                outstr += " " + utils.dash_marker + " " + " ".join(self.__dict__[field_subtypes]).title()

            if self.__dict__[field_pt]:
                outstr += " (" + utils.from_unary(self.__dict__[field_pt]) + ")"

            if self.__dict__[field_loyalty]:
                outstr += " ((" + utils.from_unary(self.__dict__[field_loyalty]) + "))"

            if self.__dict__[field_text].text:
                outstr += linebreak

                mtext = self.__dict__[field_text].text
                mtext = transforms.text_unpass_1_choice(mtext, delimit=False)
                mtext = transforms.text_unpass_2_counters(mtext)
                # mtext = transforms.text_unpass_3_uncast(mtext)
                mtext = transforms.text_unpass_4_unary(mtext)
                mtext = transforms.text_unpass_5_symbols(mtext, for_forum, for_html)
                mtext = sentencecase(mtext)
                mtext = transforms.text_unpass_6_cardname(mtext, cardname)
                mtext = transforms.text_unpass_7_newlines(mtext)
                # mtext = transforms.text_unpass_8_unicode(mtext)
                newtext = Manatext("")
                newtext.text = mtext
                newtext.costs = self.__dict__[field_text].costs

                outstr += newtext.format(for_forum=for_forum, for_html=for_html)

            if vdump and self.__dict__[field_other]:
                outstr += linebreak

                if for_html:
                    outstr += "<i>"
                elif for_forum:
                    outstr += "[i]"
                else:
                    outstr += utils.dash_marker * 2

                first = True
                for idx, value in self.__dict__[field_other]:
                    if for_html:
                        if not first:
                            outstr += "<br>\n"
                        else:
                            first = False
                    else:
                        outstr += linebreak
                    outstr += "(" + str(idx) + ") " + str(value)

                if for_html:
                    outstr += "</i>"
                if for_forum:
                    outstr += "[/i]"

        else:
            cardname = self.__dict__[field_name]
            # cardname = transforms.name_unpass_1_dashes(self.__dict__[field_name])
            if vdump and not cardname:
                cardname = "_NONAME_"
            outstr += cardname

            coststr = self.__dict__[field_cost].format(for_forum=for_forum, for_html=for_html)
            if vdump or not coststr == "_NOCOST_":
                outstr += " " + coststr

            if vdump:
                if not self.parsed:
                    outstr += " _UNPARSED_"
                if not self.valid:
                    outstr += " _INVALID_"

            if for_html and for_forum:
                # force for_html to false to create tootip with forum spoiler
                outstr += (
                    '<div class="hover_img"><a href="#">[F]</a> <span><p>'
                    + self.format(gatherer=gatherer, for_forum=for_forum, for_html=False, vdump=vdump).replace(
                        "\n", "<br>"
                    )
                    + '</p></span></div><a href="#top" style="float: right;">back to top</a>'
                )

            outstr += linebreak

            outstr += " ".join(self.__dict__[field_supertypes] + self.__dict__[field_types])
            if self.__dict__[field_subtypes]:
                outstr += " " + utils.dash_marker + " " + " ".join(self.__dict__[field_subtypes])

            if self.__dict__[field_rarity]:
                if self.__dict__[field_rarity] in utils.json_rarity_unmap:
                    rarity = utils.json_rarity_unmap[self.__dict__[field_rarity]]
                else:
                    rarity = self.__dict__[field_rarity]
                outstr += " (" + rarity.lower() + ")"

            if self.__dict__[field_text].text:
                outstr += linebreak

                mtext = self.__dict__[field_text].text
                mtext = transforms.text_unpass_1_choice(mtext, delimit=True)
                # mtext = transforms.text_unpass_2_counters(mtext)
                # mtext = transforms.text_unpass_3_uncast(mtext)
                mtext = transforms.text_unpass_4_unary(mtext)
                mtext = transforms.text_unpass_5_symbols(mtext, for_forum, for_html)
                # mtext = transforms.text_unpass_6_cardname(mtext, cardname)
                mtext = transforms.text_unpass_7_newlines(mtext)
                # mtext = transforms.text_unpass_8_unicode(mtext)
                newtext = Manatext("")
                newtext.text = mtext
                newtext.costs = self.__dict__[field_text].costs

                outstr += newtext.format(for_forum=for_forum, for_html=for_html)

            if self.__dict__[field_pt]:
                outstr += linebreak
                outstr += "(" + utils.from_unary(self.__dict__[field_pt]) + ")"

            if self.__dict__[field_loyalty]:
                outstr += linebreak
                outstr += "((" + utils.from_unary(self.__dict__[field_loyalty]) + "))"

            if vdump and self.__dict__[field_other]:
                outstr += linebreak

                if for_html:
                    outstr += "<i>"
                else:
                    outstr += utils.dash_marker * 2

                first = True
                for idx, value in self.__dict__[field_other]:
                    if for_html:
                        if not first:
                            outstr += "<br>\n"
                        else:
                            first = False
                    else:
                        outstr += linebreak
                    outstr += "(" + str(idx) + ") " + str(value)

                if for_html:
                    outstr += "</i>"

        if self.bside:
            if for_html:
                outstr += "\n"
                # force for_forum to false so that the inner div doesn't duplicate the forum
                # spoiler of the bside
                outstr += self.bside.format(gatherer=gatherer, for_forum=False, for_html=for_html, vdump=vdump)
            else:
                outstr += linebreak
                outstr += utils.dash_marker * 8
                outstr += linebreak
                outstr += self.bside.format(gatherer=gatherer, for_forum=for_forum, for_html=for_html, vdump=vdump)

        # if for_html:
        #     if for_forum:
        #         outstr += linebreak
        #         # force for_html to false to create a copyable forum spoiler div
        #         outstr += ('<div>'
        #                    + self.format(gatherer=gatherer, for_forum=for_forum, for_html=False, vdump=vdump).replace('\n', '<br>')
        #                    + '</div>')
        if for_html:
            outstr += "</div>"

        return outstr
Example #13
0
    def format(self, gatherer = False, for_forum = False, for_mse = False):
        outstr = ''
        if gatherer:
            cardname = titlecase(self.__dict__[field_name])
            if not cardname:
                cardname = '_NONAME_'
            if for_forum:
                outstr += '[b]'
            outstr += cardname
            if for_forum:
                outstr += '[/b]'

            outstr += ' ' + self.__dict__[field_cost].format(for_forum = for_forum)

            if self.__dict__[field_rarity]:
                if self.__dict__[field_rarity] in utils.json_rarity_unmap:
                    rarity = utils.json_rarity_unmap[self.__dict__[field_rarity]]
                else:
                    rarity = self.__dict__[field_rarity]
                outstr += ' (' + rarity + ')'

            if not self.parsed:
                outstr += ' _UNPARSED_'
            if not self.valid:
                outstr += ' _INVALID_'
                
            outstr += '\n'

            basetypes = map(str.capitalize, self.__dict__[field_types])
            if len(basetypes) < 1:
                basetypes = ['_NOTYPE_']
            
            outstr += ' '.join(map(str.capitalize, self.__dict__[field_supertypes]) + basetypes)

            if self.__dict__[field_subtypes]:
                outstr += (' ' + utils.dash_marker + ' ' + 
                           ' '.join(self.__dict__[field_subtypes]).title())

            if self.__dict__[field_pt]:
                outstr += ' (' + utils.from_unary(self.__dict__[field_pt]) + ')'

            if self.__dict__[field_loyalty]:
                outstr += ' ((' + utils.from_unary(self.__dict__[field_loyalty]) + '))'

            outstr += '\n'

            if self.__dict__[field_text].text:
                mtext = self.__dict__[field_text].text
                mtext = transforms.text_unpass_1_choice(mtext, delimit = False)
                mtext = transforms.text_unpass_2_counters(mtext)
                mtext = transforms.text_unpass_3_unary(mtext)
                mtext = transforms.text_unpass_4_symbols(mtext, for_forum)
                mtext = sentencecase(mtext)
                mtext = transforms.text_unpass_5_cardname(mtext, cardname)
                mtext = transforms.text_unpass_6_newlines(mtext)
                newtext = Manatext('')
                newtext.text = mtext
                newtext.costs = self.__dict__[field_text].costs
                outstr += newtext.format(for_forum = for_forum)
            
                outstr += '\n'

            if self.__dict__[field_other]:
                if for_forum:
                    outstr += '[i]'
                else:
                    outstr += utils.dash_marker * 2
                    outstr += '\n'
                for idx, value in self.__dict__[field_other]:
                    outstr += '<' + str(idx) + '> ' + str(value)
                    outstr += '\n'
                if for_forum:
                    outstr = outstr[:-1] # hack off the last newline
                    outstr += '[/i]'
                    outstr += '\n'

        elif for_forum:
            cardname = self.__dict__[field_name]
            outstr += cardname
            if self.__dict__[field_rarity]:
                if self.__dict__[field_rarity] in utils.json_rarity_unmap:
                    rarity = utils.json_rarity_unmap[self.__dict__[field_rarity]]
                else:
                    rarity = self.__dict__[field_rarity]
                outstr += ' (' + rarity.lower() + ')'
            if not self.parsed:
                outstr += ' _UNPARSED_'
            if not self.valid:
                outstr += ' _INVALID_'
            outstr += '\n'
            
            outstr += self.__dict__[field_cost].format(for_forum = for_forum)
            outstr += '\n'

            outstr += ' '.join(self.__dict__[field_supertypes] + self.__dict__[field_types])
            if self.__dict__[field_subtypes]:
                outstr += ' ' + utils.dash_marker + ' ' + ' '.join(self.__dict__[field_subtypes])
            outstr += '\n'
            
            if self.__dict__[field_text].text:
                mtext = self.__dict__[field_text].text
                mtext = transforms.text_unpass_1_choice(mtext, delimit = True)
                #mtext = transforms.text_unpass_2_counters(mtext)
                mtext = transforms.text_unpass_3_unary(mtext)
                mtext = transforms.text_unpass_4_symbols(mtext, for_forum)
                #mtext = transforms.text_unpass_5_cardname(mtext, cardname)
                mtext = transforms.text_unpass_6_newlines(mtext)
                newtext = Manatext('')
                newtext.text = mtext
                newtext.costs = self.__dict__[field_text].costs
                outstr += newtext.format(for_forum = for_forum) + '\n'

            if self.__dict__[field_pt]:
                outstr += '(' + utils.from_unary(self.__dict__[field_pt]) + ')'
                outstr += '\n'

            if self.__dict__[field_loyalty]:
                outstr += '((' + utils.from_unary(self.__dict__[field_loyalty]) + '))'
                outstr += '\n'
                
            if self.__dict__[field_other]:
                outstr += utils.dash_marker * 2
                outstr += '\n'
                for idx, value in self.__dict__[field_other]:
                    outstr += '<' + str(idx) + '> ' + str(value)
                    outstr += '\n'


        elif for_mse:
            # need a 'card' string first
            outstr += 'card:\n'
            cardname = titlecase(self.__dict__[field_name])
            outstr += '\tname: ' + cardname + '\n'
            if self.__dict__[field_rarity]:
                if self.__dict__[field_rarity] in utils.json_rarity_unmap:
                    rarity = utils.json_rarity_unmap[self.__dict__[field_rarity]]
                else:
                    rarity = self.__dict__[field_rarity]
                outstr += '\trarity: ' + rarity.lower() + '\n'
            #if not self.parsed:
            #    outstr += ' _UNPARSED_'
            #if not self.valid:
            #    outstr += ' _INVALID_'
            
            if "land" not in self.__dict__[field_types]:            
                outstr += '\tcasting cost: ' + self.__dict__[field_cost].format(for_forum = for_forum).replace('{','').replace('}','')
                outstr += '\n'

            outstr += '\tsuper type: ' + ' '.join(self.__dict__[field_supertypes] + self.__dict__[field_types]).title() + '\n'
            #outstr += 'sub type: ' + ' '.join(self.__dict__[field_types])
            if self.__dict__[field_subtypes]:
                outstr += '\tsub type: ' + ' '.join(self.__dict__[field_subtypes]).title()
                outstr += '\n'
            
            if self.__dict__[field_text].text:
                mtext = self.__dict__[field_text].text
                mtext = transforms.text_unpass_1_choice(mtext, delimit = False)
                mtext = transforms.text_unpass_2_counters(mtext)
                mtext = transforms.text_unpass_3_unary(mtext)
                mtext = transforms.text_unpass_4_symbols(mtext, for_forum)
                mtext = transforms.text_unpass_5_cardname(mtext, cardname)
                mtext = transforms.text_unpass_6_newlines(mtext)
                newtext = Manatext('')
                newtext.text = mtext
                newtext.costs = self.__dict__[field_text].costs
                newtext = newtext.format(for_forum = for_forum)
                newtext = newtext.replace(utils.this_marker, cardname) # first let's put the cardname where all the @s are.
                newtext = newtext.replace(utils.counter_rename + ".", "countered.") # then replace any 'uncast' at the end of a sentence with 'countered'.
                newtext = newtext.replace(utils.dash_marker, "—") # also replace the ~ with a — for choices.
                newtext = newtext.replace(utils.counter_rename, "counter") # then replace all the mid-sentence 'uncast' with 'counter'.
                newtext = newtext.replace('{','<sym-auto>').replace('}','</sym-auto>') # now we encase mana/tap symbols with the correct tags for mse.
                linecount = newtext.count('\n') + 1 # adding 1 because no newlines means 1 line, 1 newline means 2 lines etc.

                newtext = uppercaseNewLineAndFullstop(newtext) # make all the things uppercase!

                # done after uppercasing everything because string[i] == • doesn't work apparently.
                newtext = newtext.replace(utils.bullet_marker, "•") # replace the = with a •. 

                newlineIndices = [0] # also need to keep track of pure newlines (for planeswalkers).
                for i in range (len(newtext)):
                    if  newtext[i] == '\n':
                        newlineIndices.append(i + 1)

                # need to do Special Things if it's a planeswalker.
                if "planeswalker" in str(self.__dict__[field_types]): # for some reason this is in types, not supertypes...
                    outstr += '\tstylesheet: m15-planeswalker\n' # set the proper card style for a 3-line walker.

                    # set up the loyalty cost fields using regex to find how many there are.
                    i = 0
                    for costs in re.findall('[-+]\d?\d: ', newtext): # regex handles 2-figure loyalty costs.
                        i += 1
                        outstr += '\tloyalty cost ' + str(i) + ': ' + costs + '\n'
                    # sub out the loyalty costs.
                    newtext = re.sub('[-+]\d?\d: ', '', newtext)

                    newtext = uppercaseNewLineAndFullstop(newtext) # we need to uppercase again; previous uppercase call didn't work due to loyalty costs being there.

                    if self.__dict__[field_loyalty]:
                        outstr += '\tloyalty: ' + utils.from_unary(self.__dict__[field_loyalty]) + '\n'

                # have to do special snowflake stuff for rule text with more than 1 line. 2 or more lines need to be double-indented...                
                if linecount == 1:
                    outstr += '\trule text: ' + newtext + '\n'
                elif linecount > 1:
                    newtext = newtext.replace('\n','\n\t\t')
                    outstr += '\trule text:\n\t\t' + newtext + '\n'

                # also uncast still exists at this point? weird. should be 'unpassed' apparently. until then, did a manual replace.

            if self.__dict__[field_pt]:
                ptstring = utils.from_unary(self.__dict__[field_pt]).split('/')
                if (len(ptstring) > 1): #really don't want to be accessing anything nonexistent.
                    outstr += '\tpower: ' + ptstring[0] + '\n'
                    outstr += '\ttoughness: ' + ptstring[1] + '\n'
                #outstr += '\n'

            # now append all the other useless fields that the setfile expects.
            outstr += '\thas styling: false\n\tnotes:\n\ttime created:2015-07-20 22:53:07\n\ttime modified:2015-07-20 22:53:08\n\textra data:\n\timage:\n\tcard code text:\n\tcopyright:\n\timage 2:\n\tcopyright 2: '

            #print outstr

        if self.bside and not for_mse:
            outstr += utils.dash_marker * 8 + '\n'
            outstr += self.bside.format(gatherer = gatherer, for_forum = for_forum)

        return outstr
def text_unpass_4_unary(s):
    return utils.from_unary(s)
Example #15
0
 def outliers(self, hsize = 10, vsize = 10, dump_invalid = False):
     print '********************'
     print 'Overview of indices:'
     rows = [['Index Name', 'Keys', 'Total Members']]
     for index in self.indices:
         rows += [[index, len(self.indices[index]), index_size(self.indices[index])]]
     printrows(padrows(rows))
     print '********************'
     if len(self.by_name) > 0:
         scardname =  sorted(self.by_name, 
                             lambda x,y: cmp(len(x), len(y)), 
                             reverse = False)[0]
         print 'Shortest Cardname: (' + str(len(scardname)) + ')'
         print '  ' + scardname
         lcardname =  sorted(self.by_name, 
                             lambda x,y: cmp(len(x), len(y)), 
                             reverse = True)[0]
         print 'Longest Cardname: (' + str(len(lcardname)) + ')'
         print '  ' + lcardname
         d = sorted(self.by_name, 
                    lambda x,y: cmp(len(self.by_name[x]), len(self.by_name[y])), 
                    reverse = True)
         rows = []
         for k in d[0:vsize]:
             if len(self.by_name[k]) > 1:
                 rows += [[k, len(self.by_name[k])]]
         if rows == []:
             print('No duplicated cardnames')
         else:
             print '-- Most duplicated names: --'
             printrows(padrows(rows))
     else:
         print 'No cards indexed by name?'
     print '--------------------'
     if len(self.by_type) > 0:
         ltypes = sorted(self.by_type, 
                         lambda x,y: cmp(len(x), len(y)), 
                         reverse = True)[0]
         print 'Longest card type: (' + str(len(ltypes)) + ')'
         print '  ' + ltypes
     else:
         print 'No cards indexed by type?'
     if len(self.by_subtype) > 0:
         lsubtypes = sorted(self.by_subtype, 
                            lambda x,y: cmp(len(x), len(y)), 
                            reverse = True)[0]
         print 'Longest subtype: (' + str(len(lsubtypes)) + ')'
         print '  ' + lsubtypes
     else:
         print 'No cards indexed by subtype?'
     if len(self.by_supertype) > 0:
         lsupertypes = sorted(self.by_supertype, 
                         lambda x,y: cmp(len(x), len(y)), 
                              reverse = True)[0]
         print 'Longest supertype: (' + str(len(lsupertypes)) + ')'
         print '  ' + lsupertypes
     else:
         print 'No cards indexed by supertype?'
     print '--------------------'
     if len(self.by_cost) > 0:
         lcost = sorted(self.by_cost, 
                        lambda x,y: cmp(len(x), len(y)), 
                        reverse = True)[0]
         print 'Longest mana cost: (' + str(len(lcost)) + ')'
         print '  ' + utils.from_mana(lcost)
         print '\n' + plimit(self.by_cost[lcost][0].encode()) + '\n'
     else:
         print 'No cards indexed by cost?'
     if len(self.by_cmc) > 0:
         lcmc = sorted(self.by_cmc, reverse = True)[0]
         print 'Largest cmc: (' + str(lcmc) + ')'
         print '  ' + str(self.by_cmc[lcmc][0].cost)
         print '\n' + plimit(self.by_cmc[lcmc][0].encode())
     else:
         print 'No cards indexed by cmc?'
     print '--------------------'
     if len(self.by_power) > 0:
         lpower = sorted(self.by_power, 
                         lambda x,y: cmp(len(x), len(y)), 
                         reverse = True)[0]
         print 'Largest creature power: ' + utils.from_unary(lpower)
         print '\n' + plimit(self.by_power[lpower][0].encode()) + '\n'
     else: 
         print 'No cards indexed by power?'
     if len(self.by_toughness) > 0:
         ltoughness = sorted(self.by_toughness, 
                         lambda x,y: cmp(len(x), len(y)), 
                         reverse = True)[0]
         print 'Largest creature toughness: ' + utils.from_unary(ltoughness)
         print '\n' + plimit(self.by_toughness[ltoughness][0].encode())
     else: 
         print 'No cards indexed by toughness?'
     print '--------------------'
     if len(self.by_textlines) > 0:
         llines = sorted(self.by_textlines, reverse = True)[0]
         print 'Most lines of text in a card: ' + str(llines)
         print '\n' + plimit(self.by_textlines[llines][0].encode()) + '\n'
     else: 
         print 'No cards indexed by line count?'
     if len(self.by_textlen) > 0:
         ltext = sorted(self.by_textlen, reverse = True)[0]
         print 'Most chars in a card text: ' + str(ltext)
         print '\n' + plimit(self.by_textlen[ltext][0].encode())
     else: 
         print 'No cards indexed by char count?'
     print '--------------------'
     print 'There were ' + str(len(self.invalid_cards)) + ' invalid cards.'
     if dump_invalid:
         for card in self.invalid_cards:
             print '\n' + repr(card.fields)
     elif len(self.invalid_cards) > 0:
         print 'Not summarizing.'
     print '--------------------'
     print 'There were ' + str(len(self.unparsed_cards)) + ' unparsed cards.'
     if dump_invalid:
         for card in self.unparsed_cards:
             print '\n' + repr(card.fields)
     elif len(self.unparsed_cards) > 0:
         print 'Not summarizing.'
     print '===================='
Example #16
0
 def summarize(self, hsize = 10, vsize = 10, cmcsize = 20):
     print '===================='
     print str(len(self.cards)) + ' valid cards, ' + str(len(self.invalid_cards)) + ' invalid cards.'
     print str(len(self.allcards)) + ' cards parsed, ' + str(len(self.unparsed_cards)) + ' failed to parse'
     print '--------------------'
     print str(len(self.by_name)) + ' unique card names'
     print '--------------------'
     print (str(len(self.by_color_inclusive)) + ' represented colors (including colorless as \'A\'), ' 
            + str(len(self.by_color)) + ' combinations')
     print 'Breakdown by color:'
     rows = [self.by_color_inclusive.keys()]
     rows += [[len(self.by_color_inclusive[k]) for k in rows[0]]]
     printrows(padrows(rows))
     print 'Breakdown by number of colors:'
     rows = [self.by_color_count.keys()]
     rows += [[len(self.by_color_count[k]) for k in rows[0]]]
     printrows(padrows(rows))
     print '--------------------'
     print str(len(self.by_type_inclusive)) + ' unique card types, ' + str(len(self.by_type)) + ' combinations'
     print 'Breakdown by type:'
     d = sorted(self.by_type_inclusive, 
                lambda x,y: cmp(len(self.by_type_inclusive[x]), len(self.by_type_inclusive[y])), 
                reverse = True)
     rows = [[k for k in d[:hsize]]]
     rows += [[len(self.by_type_inclusive[k]) for k in rows[0]]]
     printrows(padrows(rows))
     print '--------------------'
     print (str(len(self.by_subtype_inclusive)) + ' unique subtypes, ' 
            + str(len(self.by_subtype)) + ' combinations')
     print '-- Popular subtypes: --'
     d = sorted(self.by_subtype_inclusive, 
                lambda x,y: cmp(len(self.by_subtype_inclusive[x]), len(self.by_subtype_inclusive[y])), 
                reverse = True)
     rows = []
     for k in d[0:vsize]:
         rows += [[k, len(self.by_subtype_inclusive[k])]]
     printrows(padrows(rows))
     print '-- Top combinations: --'
     d = sorted(self.by_subtype, 
                lambda x,y: cmp(len(self.by_subtype[x]), len(self.by_subtype[y])), 
                reverse = True)
     rows = []
     for k in d[0:vsize]:
         rows += [[k, len(self.by_subtype[k])]]
     printrows(padrows(rows))
     print '--------------------'
     print (str(len(self.by_supertype_inclusive)) + ' unique supertypes, ' 
            + str(len(self.by_supertype)) + ' combinations')
     print 'Breakdown by supertype:'
     d = sorted(self.by_supertype_inclusive, 
                lambda x,y: cmp(len(self.by_supertype_inclusive[x]),len(self.by_supertype_inclusive[y])), 
                reverse = True)
     rows = [[k for k in d[:hsize]]]
     rows += [[len(self.by_supertype_inclusive[k]) for k in rows[0]]]
     printrows(padrows(rows))
     print '--------------------'
     print str(len(self.by_cmc)) + ' different CMCs, ' + str(len(self.by_cost)) + ' unique mana costs'
     print 'Breakdown by CMC:'
     d = sorted(self.by_cmc, reverse = False)
     rows = [[k for k in d[:cmcsize]]]
     rows += [[len(self.by_cmc[k]) for k in rows[0]]]
     printrows(padrows(rows))
     print '-- Popular mana costs: --'
     d = sorted(self.by_cost, 
                lambda x,y: cmp(len(self.by_cost[x]), len(self.by_cost[y])), 
                reverse = True)
     rows = []
     for k in d[0:vsize]:
         rows += [[utils.from_mana(k), len(self.by_cost[k])]]
     printrows(padrows(rows))
     print '--------------------'
     print str(len(self.by_pt)) + ' unique p/t combinations'
     if len(self.by_power) > 0 and len(self.by_toughness) > 0:
         print ('Largest power: ' + str(max(map(len, self.by_power)) - 1) + 
                ', largest toughness: ' + str(max(map(len, self.by_toughness)) - 1))
     print '-- Popular p/t values: --'
     d = sorted(self.by_pt, 
                lambda x,y: cmp(len(self.by_pt[x]), len(self.by_pt[y])), 
                reverse = True)
     rows = []
     for k in d[0:vsize]:
         rows += [[utils.from_unary(k), len(self.by_pt[k])]]
     printrows(padrows(rows))
     print '--------------------'
     print 'Loyalty values:'
     d = sorted(self.by_loyalty, 
                lambda x,y: cmp(len(self.by_loyalty[x]), len(self.by_loyalty[y])), 
                reverse = True)
     rows = []
     for k in d[0:vsize]:
         rows += [[utils.from_unary(k), len(self.by_loyalty[k])]]
     printrows(padrows(rows))
     print '--------------------'
     if len(self.by_textlen) > 0 and len(self.by_textlines) > 0:
         print('Card text ranges from ' + str(min(self.by_textlen)) + ' to ' 
               + str(max(self.by_textlen)) + ' characters in length')
         print('Card text ranges from ' + str(min(self.by_textlines)) + ' to '
               + str(max(self.by_textlines)) + ' lines')
     print '-- Line counts by frequency: --'
     d = sorted(self.by_textlines, 
                lambda x,y: cmp(len(self.by_textlines[x]), len(self.by_textlines[y])), 
                reverse = True)
     rows = []
     for k in d[0:vsize]:
         rows += [[k, len(self.by_textlines[k])]]
     printrows(padrows(rows))
     print '===================='