From dcfea89ec73e53c0f61c0ea37cb950238b31becd Mon Sep 17 00:00:00 2001 From: Dmytro Yeroshkin Date: Fri, 22 Oct 2021 11:24:36 +0200 Subject: [PATCH] Added multi-status chapter support --- novel_stats/novel_stats.py | 40 ++++++++++++++++++++++++-------------- 1 file changed, 25 insertions(+), 15 deletions(-) diff --git a/novel_stats/novel_stats.py b/novel_stats/novel_stats.py index 899740d..b390794 100755 --- a/novel_stats/novel_stats.py +++ b/novel_stats/novel_stats.py @@ -33,19 +33,26 @@ def main(): word_count_by_status = collections.defaultdict(int) word_count_by_act = collections.defaultdict(int) status_by_chapter = {} + current_status = None for line in open(filename).readlines(): if line.startswith(CHAPTER_MARKER): word_count_by_act[act_heading] += word_count_by_chapter[chapter_heading] total_word_count += word_count_by_chapter[chapter_heading] - if chapter_heading in status_by_chapter: - word_count_by_status[status_by_chapter[chapter_heading]] += 1 chapter_heading = line[len(CHAPTER_MARKER):].strip('()\n') word_count_by_chapter[chapter_heading] = count_words(chapter_heading) # Count the words in chapter heading, because the chapter number and title count as words. + + status_by_chapter[chapter_heading] = collections.defaultdict(int) + current_status = None elif line.startswith(STATUS_MARKER): - status_by_chapter[chapter_heading] = line[len(STATUS_MARKER):].strip('()\n') + if current_status == None: + current_status = line[len(STATUS_MARKER):].strip('()\n') + status_by_chapter[chapter_heading][current_status] = count_words(chapter_heading) + else: + current_status = line[len(STATUS_MARKER):].strip('()\n') + status_by_chapter[chapter_heading][current_status] += 0 elif line.startswith(ACT_MARKER): act_heading = line[len(ACT_MARKER):].strip('()\n') word_count_by_act[act_heading] = count_words(act_heading) @@ -55,29 +62,32 @@ def main(): line_word_count = count_words(line) word_count_by_chapter[chapter_heading] += line_word_count - if chapter_heading in status_by_chapter: - word_count_by_status[status_by_chapter[chapter_heading]] += line_word_count + if current_status: + word_count_by_status[current_status] += line_word_count + status_by_chapter[chapter_heading][current_status] += line_word_count # Do some final accounting after the last chapter. word_count_by_act[act_heading] += word_count_by_chapter[chapter_heading] total_word_count += word_count_by_chapter[chapter_heading] - if chapter_heading in status_by_chapter: - word_count_by_status[status_by_chapter[chapter_heading]] += 1 # Print out word counts. for chapter_heading, chapter_word_count in word_count_by_chapter.items(): if chapter_heading is None: continue - chapter_status = status_by_chapter.get(chapter_heading) - print( - 'chapter {}: {:,} words{}'.format( - chapter_heading, - chapter_word_count, - ' ({})'.format(chapter_status) if chapter_status else '', - ) - ) + if len(status_by_chapter[chapter_heading]) > 1: + print(f'chapter {chapter_heading}:') + + for chapter_status, status_count in status_by_chapter[chapter_heading].items(): + print(f'\t {status_count:,} ({chapter_status})') + print(f'\t {chapter_word_count:,} words (total)') + elif len(status_by_chapter[chapter_heading]) == 1: + chapter_status = list(status_by_chapter[chapter_heading].keys())[0] + print(f'chapter {chapter_heading}: {chapter_word_count:,} ({chapter_status})') + else: + print(f'chapter {chapter_heading}: {chapter_word_count:,}') + print()