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
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
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
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 '===================='
def text_unpass_4_unary(s): return utils.from_unary(s)
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
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
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
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 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
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 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 '===================='