From 6b0112dc264344b7da5b821f5ab6753705858733 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?tr=C3=A9meur?= <eheu48@gmail.com>
Date: Sat, 24 Jun 2023 08:48:29 +0100
Subject: [PATCH] Account for unrevealed exchange/challenge fics, change some
 wording

---
 characters.py             |  98 +++--
 events.py                 |  28 +-
 feed.py                   |  32 +-
 indexgen.py               |   2 +-
 makeheader.py             | 824 +++++++++++++++++++-------------------
 masterlist.py             |   2 +-
 originalsmeta/template.py |   1 +
 ships.py                  |  48 ++-
 statsgen.py               | 138 ++++---
 9 files changed, 641 insertions(+), 532 deletions(-)

diff --git a/characters.py b/characters.py
index 5f5cd3d..f54141c 100644
--- a/characters.py
+++ b/characters.py
@@ -1,4 +1,4 @@
-import os
+import datetime, os
 from importlib import import_module
 
 fffandoms = ["FF1","FF2","FF3","FF4","FF5","FF6","FF7","FF8","FF9","FFX","FF11","FF12","FF13","FF14","FF15"]
@@ -29,24 +29,32 @@ def charlist(local=False):
             if os.path.exists("originalsmeta/" + ficcountstring + ".py"):
                 ficfile = "originalsmeta." + ficcountstring
                 fileread = import_module(ficfile)
-                if len(fileread.fandom) == 1:
-                    if fandom in fileread.fandom:
-                        try:
-                            thecharacters.extend(fileread.charpov)
-                        except:
-                            pass
-                        try:
-                            thecharacters.extend(fileread.charmain)
-                        except:
-                            pass
-                        try:
-                            thecharacters.extend(fileread.charsecondary)
-                        except:
-                            pass
-                        try:
-                            thecharacters.extend(fileread.charmention)
-                        except:
-                            pass
+                try:
+                    if fileread.revealdate > datetime.datetime.now():
+                        revealed = False
+                    else:
+                        revealed = True
+                except:
+                    revealed = True
+                if revealed == True:
+                    if len(fileread.fandom) == 1:
+                        if fandom in fileread.fandom:
+                            try:
+                                thecharacters.extend(fileread.charpov)
+                            except:
+                                pass
+                            try:
+                                thecharacters.extend(fileread.charmain)
+                            except:
+                                pass
+                            try:
+                                thecharacters.extend(fileread.charsecondary)
+                            except:
+                                pass
+                            try:
+                                thecharacters.extend(fileread.charmention)
+                            except:
+                                pass
         thecharacters = sorted(list(dict.fromkeys(thecharacters)))
         for character in thecharacters:
             if character != "OCs":
@@ -74,28 +82,36 @@ def charlist(local=False):
             if os.path.exists("originalsmeta/" + ficcountstring + ".py"):
                 countfile = "originalsmeta." + ficcountstring
                 fileread = import_module(countfile)
-                if searchfandom in fileread.fandom:
-                    # append to lists
-                    try:
-                        if character in fileread.charpov:
-                            povcount.append(ficcount)
-                    except:
-                        pass
-                    try:
-                        if character in fileread.charmain:
-                            maincount.append(ficcount)
-                    except:
-                        pass
-                    try:
-                        if character in fileread.charsecondary:
-                            secondarycount.append(ficcount)
-                    except:
-                        pass
-                    try:
-                        if character in fileread.charmention:
-                            mentioncount.append(ficcount)
-                    except:
-                        pass
+                try:
+                    if fileread.revealdate > datetime.datetime.now():
+                        revealed = False
+                    else:
+                        revealed = True
+                except:
+                    revealed = True
+                if revealed == True:
+                    if searchfandom in fileread.fandom:
+                        # append to lists
+                        try:
+                            if character in fileread.charpov:
+                                povcount.append(ficcount)
+                        except:
+                            pass
+                        try:
+                            if character in fileread.charmain:
+                                maincount.append(ficcount)
+                        except:
+                            pass
+                        try:
+                            if character in fileread.charsecondary:
+                                secondarycount.append(ficcount)
+                        except:
+                            pass
+                        try:
+                            if character in fileread.charmention:
+                                mentioncount.append(ficcount)
+                        except:
+                            pass
         # write details element
         output = "build/ff/characters/index.html"
         filewrite = open(output, "a")
diff --git a/events.py b/events.py
index e079b87..00e0614 100644
--- a/events.py
+++ b/events.py
@@ -25,12 +25,20 @@ def eventlist(local=False):
             ficfile = "originalsmeta." + ficcountstring
             fileread = import_module(ficfile)
             try:
-                events.append({"name":fileread.eventname,"location":fileread.eventlocation,"sortname":fileread.eventname.lower()})
+                if fileread.revealdate > datetime.datetime.now():
+                    revealed = False
+                else:
+                    revealed = True
             except:
+                revealed = True
+            if revealed == True:
                 try:
-                    events.append({"name":fileread.eventname,"location":"","sortname":fileread.eventname.lower()})
+                    events.append({"name":fileread.eventname,"location":fileread.eventlocation,"sortname":fileread.eventname.lower()})
                 except:
-                    pass
+                    try:
+                        events.append({"name":fileread.eventname,"location":"","sortname":fileread.eventname.lower()})
+                    except:
+                        pass
     newlist = []
     for event in events:
         if event not in newlist:
@@ -53,10 +61,18 @@ def eventlist(local=False):
                 countfile = "originalsmeta." + ficcountstring
                 fileread = import_module(countfile)
                 try:
-                    if fileread.eventname == theevent:
-                        evententries.append({"ficno":ficcount,"year":(fileread.datewords[0])["date"].year,"fandom":fileread.fandom})
+                    if fileread.revealdate > datetime.datetime.now():
+                        revealed = False
+                    else:
+                        revealed = True
                 except:
-                    pass
+                    revealed = True
+                if revealed == True:
+                    try:
+                        if fileread.eventname == theevent:
+                            evententries.append({"ficno":ficcount,"year":(fileread.datewords[0])["date"].year,"fandom":fileread.fandom})
+                    except:
+                        pass
         eventfandoms = []
         for entry in evententries:
             eventfandoms.extend(entry["fandom"])
diff --git a/feed.py b/feed.py
index f9309b3..1cf4e26 100644
--- a/feed.py
+++ b/feed.py
@@ -26,8 +26,12 @@ def feedgen(local=False):
         if os.path.exists("originalsmeta/" + ficcountstring + ".py"):
             ficfile = "originalsmeta." + ficcountstring
             fileread = import_module(ficfile)
-            for instalment in fileread.datewords:
-                datelist.append(instalment["date"])
+            try:
+                if fileread.revealdate <= datetime.datetime.now():
+                    datelist.append(fileread.revealdate)
+            except:
+                for instalment in fileread.datewords:
+                    datelist.append(instalment["date"])
         elif os.path.exists("translationsmeta/" + ficcountstring + ".py"):
             ficfile = "translationsmeta." + ficcountstring
             fileread = import_module(ficfile)
@@ -52,10 +56,16 @@ def feedgen(local=False):
             if os.path.exists("originalsmeta/" + ficcountstring + ".py"):
                 ficfile = "originalsmeta." + ficcountstring
                 fileread = import_module(ficfile)
-                for instalment in fileread.datewords:
-                    if instalment["date"] == date:
-                        if targetfile == 0:
-                            targetfile = ficfile
+                try:
+                    if fileread.revealdate <= datetime.datetime.now():
+                        if fileread.revealdate == date:
+                            if targetfile == 0:
+                                targetfile = ficfile
+                except:
+                    for instalment in fileread.datewords:
+                        if instalment["date"] == date:
+                            if targetfile == 0:
+                                targetfile = ficfile
             elif os.path.exists("translationsmeta/" + ficcountstring + ".py"):
                 transfile = "translationsmeta." + ficcountstring
                 transread = import_module(transfile)
@@ -69,8 +79,12 @@ def feedgen(local=False):
                 thefile = import_module(targetfile)
                 filewrite = open("build/feed.xml", "a")
                 filewrite.write("<item>\n<title>")
-                if (thefile.datewords[0])["date"] != date:
-                    filewrite.write("Updated: ")
+                try:
+                    if thefile.revealdate == True:
+                        pass
+                except:
+                    if (thefile.datewords[0])["date"] != date:
+                        filewrite.write("Updated: ")
                 filewrite.write("Fic " + ficcountstring)
                 if thefile.language == "fr":
                     filewrite.write (" (French)")
@@ -150,7 +164,7 @@ def feedgen(local=False):
                 filewrite.write(futuredate.strftime("%a, %-d %b %Y"))
                 filewrite.write(" 00:00:00 UT</pubDate>\n<link>")
                 if local:
-                    filewrite.write("/home/mdd/Documents/drive/proj/fic-archive/build/masterlist")
+                    filewrite.write("/home/mdd/Documents/drive/proj/fic-archive/build/masterlist/index.html")
                 else:
                     filewrite.write("https://tre.praze.net/fic/masterlist")
                 filewrite.write("#fic" + ficcountstring + "</link>\n<guid isPermaLink=\"false\">praze-fic-" + ficcountstring)
diff --git a/indexgen.py b/indexgen.py
index f9ed8a9..2295034 100644
--- a/indexgen.py
+++ b/indexgen.py
@@ -9,7 +9,7 @@ def indexgen(local=False):
     # write header
     headerfooter.headerwrite("build/index.html","Tré’s fic archive","Tré’s fic archive","",True,local)
     filewrite = open("build/index.html", "a")
-    filewrite.write("<p>Here is all my fanfiction! It’s also archived at AO3 under the name <span style=\"white-space: nowrap;\" class=\"ljuser\"><a href=\"https://archiveofourown.org/users/ovely/profile\"><img src=\"https://p.dreamwidth.org/b164c54b26e4/-/archiveofourown.org/favicon.ico\" alt=\"[archiveofourown.org profile]\" width=\"16\" height=\"16\" style=\"vertical-align: text-bottom; border: 0; padding-right: 1px;\" /></a><a href=\"https://archiveofourown.org/users/ovely/pseuds/ovely\"><b>ovely</b></a></span>.</p>\n<p>I’ve recently implemented comments – read about that <a href=\"")
+    filewrite.write("<p>Here is all my fanfiction! Much of it is also archived at AO3 under the name <span style=\"white-space: nowrap;\" class=\"ljuser\"><a href=\"https://archiveofourown.org/users/ovely/profile\"><img src=\"https://p.dreamwidth.org/b164c54b26e4/-/archiveofourown.org/favicon.ico\" alt=\"[archiveofourown.org profile]\" width=\"16\" height=\"16\" style=\"vertical-align: text-bottom; border: 0; padding-right: 1px;\" /></a><a href=\"https://archiveofourown.org/users/ovely/pseuds/ovely\"><b>ovely</b></a></span>.</p>\n<p>I’ve recently implemented comments – read about that <a href=\"")
     if local:
         filewrite.write("comments/index.html")
     else:
diff --git a/makeheader.py b/makeheader.py
index 5759dde..7b7518c 100644
--- a/makeheader.py
+++ b/makeheader.py
@@ -35,377 +35,379 @@ def ficgen(ficno,unique=False,output="output.html",local=False):
             translationfile = "translationsmeta." + translationstring
             transread = import_module(translationfile)
     except:
-        pass        
-    # write to output file
-    filewrite = open(output, "a")
-    filewrite.write("<div class=\"fic\"")
-    # give the div an id if requested
-    if unique:
-        filewrite.write(" id=\"fic" + ficnostring + "\"")
-    filewrite.write(">\n<h1><span class=\"ficno\">" + ficnostring)
-    # write ficno including translation if there is one
+        pass
     try:
-        filewrite.write("/" + translationstring)
+        if fileread.revealdate > datetime.datetime.now():
+            revealed = False
+        else:
+            revealed = True
     except:
-        pass
-    filewrite.write("</span>")
-    # write title if requested
-    if fileread.showtitle:
-        filewrite.write(" <span class=\"fictitle\">" + fileread.title)
+        revealed = True
+    if revealed == True:
+        # write to output file
+        filewrite = open(output, "a")
+        filewrite.write("<div class=\"fic\"")
+        # give the div an id if requested
+        if unique:
+            filewrite.write(" id=\"fic" + ficnostring + "\"")
+        filewrite.write(">\n<h1><span class=\"ficno\">" + ficnostring)
+        # write ficno including translation if there is one
         try:
-            if transread.showtitle:
-                filewrite.write("/" + transread.title)
+            filewrite.write("/" + translationstring)
         except:
             pass
         filewrite.write("</span>")
-    else:
-        try:
-            if transread.showtitle:
-                filewrite.write(" <span class=\"fictitle\">" + transread.title)
-        except:
-            pass
-    if fileread.status == "abandoned":
-        filewrite.write(" <span class=\"abandoned\"></span>")
-    filewrite.write("</h1>\n<ul class=\"ficmeta\">\n<li class=\"ficdate\">")
-    # write date, date range if ranged or translation
-    if fileread.status == "incomplete":
-        filewrite.write((fileread.datewords[0])["date"].strftime("%-d %B %Y") + "–")
-    else:
-        try:
-            if transread.status == "incomplete":
-                filewrite.write((fileread.datewords[0])["date"].strftime("%-d %B %Y") + "–")
-            else:
-                if fileread.translation:
-                    if (transread.datewords[-1])["date"].year == (fileread.datewords[0])["date"].year:
-                        if (transread.datewords[-1])["date"].month == (fileread.datewords[0])["date"].month:
-                            if (transread.datewords[-1])["date"].date == (fileread.datewords[0])["date"].date:
-                                filewrite.write((fileread.datewords[0])["date"].strftime("%-d %B %Y"))
-                            else:
-                                filewrite.write((fileread.datewords[0])["date"].strftime("%-d") + "–" + (transread.datewords[-1])["date"].strftime("%-d %B %Y"))
-                        else:
-                            filewrite.write((fileread.datewords[0])["date"].strftime("%-d %B") + "–" + (transread.datewords[-1])["date"].strftime("%-d %B %Y"))
-                    else:
-                        filewrite.write((fileread.datewords[0])["date"].strftime("%-d %B %Y") + "–" + (transread.datewords[-1])["date"].strftime("%-d %B %Y"))
-        except:
-            try:
-                filewrite.write(fileread.approxdate)
-            except:
-                if (fileread.datewords[0])["date"].year == (fileread.datewords[-1])["date"].year:
-                    if (fileread.datewords[0])["date"].month == (fileread.datewords[-1])["date"].month:
-                        if (fileread.datewords[0])["date"] == (fileread.datewords[-1])["date"]:
-                            filewrite.write((fileread.datewords[-1])["date"].strftime("%-d %B %Y"))
-                        else:
-                            filewrite.write((fileread.datewords[0])["date"].strftime("%-d") + "–" + (fileread.datewords[-1])["date"].strftime("%-d %B %Y"))
-                    else:
-                        filewrite.write((fileread.datewords[0])["date"].strftime("%-d %B") + "–" + (fileread.datewords[-1])["date"].strftime("%-d %B %Y"))
-                else:
-                    filewrite.write((fileread.datewords[0])["date"].strftime("%-d %B %Y") + "–" + (fileread.datewords[-1])["date"].strftime("%-d %B %Y"))
-    # write wordcount
-    sumwords = 0
-    for instalment in fileread.datewords:
-        sumwords = sumwords + instalment["words"]
-    filewrite.write("</li>\n<li class=\"wordcount\">" + str(sumwords))
-    transwords = 0
-    try:
-        for instalment in transread.datewords:
-            transwords = transwords + instalment["words"]
-        filewrite.write(" + " + str(transwords))
-    except:
-        pass
-    # write rating
-    filewrite.write("</li>\n<li class=\"rating\"><span class=\"" + fileread.rating + "\">")
-    # write reason for rating if there is one
-    try:
-        filewrite.write(" (" + fileread.ratingreason + ")")
-    except:
-        pass
-    filewrite.write("</span></li>\n<li class=\"fandom\">")
-    # write fandom
-    try:
-        filewrite.write(fileread.fandomtext)
-    except:
-        filewrite.write("/".join(fileread.fandom))
-    filewrite.write("</li>\n")
-    # write characters in pov, main, secondary categories, if they exist
-    try:
-        filewrite.write("<li class=\"characters\">" + fileread.charactertext + "</li>\n")
-    except:
-        try:
-            filewrite.write("<li class=\"characters\">" + ", ".join(fileread.charpov))
+        # write title if requested
+        if fileread.showtitle:
+            filewrite.write(" <span class=\"fictitle\">" + fileread.title)
             try:
-                filewrite.write(", " + ", ".join(fileread.charmain))
+                if transread.showtitle:
+                    filewrite.write("/" + transread.title)
             except:
                 pass
+            filewrite.write("</span>")
+        else:
             try:
-                filewrite.write(", " + "<small>" + ", ".join(fileread.charsecondary) + "</small>")
+                if transread.showtitle:
+                    filewrite.write(" <span class=\"fictitle\">" + transread.title)
             except:
                 pass
-            filewrite.write("</li>\n")
-        except:
+        if fileread.status == "abandoned":
+            filewrite.write(" <span class=\"abandoned\"></span>")
+        filewrite.write("</h1>\n<ul class=\"ficmeta\">\n<li class=\"ficdate\">")
+        # write date, date range if ranged or translation
+        if fileread.status == "incomplete":
+            filewrite.write((fileread.datewords[0])["date"].strftime("%-d %B %Y") + "–")
+        else:
             try:
-                filewrite.write("<li class=\"characters\">" + ", ".join(fileread.charmain))
-                try:
-                    filewrite.write(", " + "<small>" + ", ".join(fileread.charsecondary) + "</small>")
-                except:
-                    pass
-                filewrite.write("</li>\n")
+                if transread.status == "incomplete":
+                    filewrite.write((fileread.datewords[0])["date"].strftime("%-d %B %Y") + "–")
+                else:
+                    if fileread.translation:
+                        if (transread.datewords[-1])["date"].year == (fileread.datewords[0])["date"].year:
+                            if (transread.datewords[-1])["date"].month == (fileread.datewords[0])["date"].month:
+                                if (transread.datewords[-1])["date"].date == (fileread.datewords[0])["date"].date:
+                                    filewrite.write((fileread.datewords[0])["date"].strftime("%-d %B %Y"))
+                                else:
+                                    filewrite.write((fileread.datewords[0])["date"].strftime("%-d") + "–" + (transread.datewords[-1])["date"].strftime("%-d %B %Y"))
+                            else:
+                                filewrite.write((fileread.datewords[0])["date"].strftime("%-d %B") + "–" + (transread.datewords[-1])["date"].strftime("%-d %B %Y"))
+                        else:
+                            filewrite.write((fileread.datewords[0])["date"].strftime("%-d %B %Y") + "–" + (transread.datewords[-1])["date"].strftime("%-d %B %Y"))
             except:
                 try:
-                    filewrite.write("<li class=\"characters\">" + ", ".join(fileread.charsecondary) + "</li>\n")
+                    filewrite.write(fileread.approxdate)
                 except:
-                    pass
-    # write genre
-    filewrite.write("<li class=\"genre\">" + ", ".join(fileread.genre) + "</li>\n")
-    # write warnings if they exist
-    try:
-        filewrite.write("<li class=\"warnings\">" + fileread.warnings + "</li>\n")
-    except:
-        pass
-    # write point in canon if there is one
-    try:
-        filewrite.write("<li class=\"time\">" + fileread.time + "</li>\n")
-    except:
-        pass
-    # write locations if there are any
-    try:
-        filewrite.write("<li class=\"location\">" + fileread.locationtext + "</li>\n")
-    except:
+                    if (fileread.datewords[0])["date"].year == (fileread.datewords[-1])["date"].year:
+                        if (fileread.datewords[0])["date"].month == (fileread.datewords[-1])["date"].month:
+                            if (fileread.datewords[0])["date"] == (fileread.datewords[-1])["date"]:
+                                filewrite.write((fileread.datewords[-1])["date"].strftime("%-d %B %Y"))
+                            else:
+                                filewrite.write((fileread.datewords[0])["date"].strftime("%-d") + "–" + (fileread.datewords[-1])["date"].strftime("%-d %B %Y"))
+                        else:
+                            filewrite.write((fileread.datewords[0])["date"].strftime("%-d %B") + "–" + (fileread.datewords[-1])["date"].strftime("%-d %B %Y"))
+                    else:
+                        filewrite.write((fileread.datewords[0])["date"].strftime("%-d %B %Y") + "–" + (fileread.datewords[-1])["date"].strftime("%-d %B %Y"))
+        # write wordcount
+        sumwords = 0
+        for instalment in fileread.datewords:
+            sumwords = sumwords + instalment["words"]
+        filewrite.write("</li>\n<li class=\"wordcount\">" + str(sumwords))
+        transwords = 0
         try:
-            filewrite.write("<li class=\"location\">" + ", ".join(fileread.location) + "</li>\n")
+            for instalment in transread.datewords:
+                transwords = transwords + instalment["words"]
+            filewrite.write(" + " + str(transwords))
         except:
             pass
-    filewrite.write("</ul>\n")
-    # write summary if there is one
-    try:
-        if transread.language == "en":
+        # write rating
+        filewrite.write("</li>\n<li class=\"rating\"><span class=\"" + fileread.rating + "\">")
+        # write reason for rating if there is one
+        try:
+            filewrite.write(" (" + fileread.ratingreason + ")")
+        except:
+            pass
+        filewrite.write("</span></li>\n<li class=\"fandom\">")
+        # write fandom
+        try:
+            filewrite.write(fileread.fandomtext)
+        except:
+            filewrite.write("/".join(fileread.fandom))
+        filewrite.write("</li>\n")
+        # write characters in pov, main, secondary categories, if they exist
+        try:
+            filewrite.write("<li class=\"characters\">" + fileread.charactertext + "</li>\n")
+        except:
             try:
-                filewrite.write("<p class=\"summary\">" + transread.summary)
-                try:
-                    filewrite.write(" " + fileread.summary + "</p>\n")
-                except:
-                    filewrite.write("</p>\n")
-            except:
+                filewrite.write("<li class=\"characters\">" + ", ".join(fileread.charpov))
                 try:
-                    filewrite.write("<p class=\"summary\">" + fileread.summary + "</p>\n")
+                    filewrite.write(", " + ", ".join(fileread.charmain))
                 except:
                     pass
-        elif transread.language == "fr":
-            try:
-                filewrite.write("<p class=\"summary\">" + fileread.summary)
                 try:
-                    filewrite.write(" " + transread.summary + "</p>\n")
+                    filewrite.write(", " + "<small>" + ", ".join(fileread.charsecondary) + "</small>")
                 except:
-                    filewrite.write("</p>\n")
+                    pass
+                filewrite.write("</li>\n")
             except:
                 try:
-                    filewrite.write("<p class=\"summary\">" + transread.summary + "</p>\n")
+                    filewrite.write("<li class=\"characters\">" + ", ".join(fileread.charmain))
+                    try:
+                        filewrite.write(", " + "<small>" + ", ".join(fileread.charsecondary) + "</small>")
+                    except:
+                        pass
+                    filewrite.write("</li>\n")
                 except:
-                    pass
-    except:
+                    try:
+                        filewrite.write("<li class=\"characters\">" + ", ".join(fileread.charsecondary) + "</li>\n")
+                    except:
+                        pass
+        # write genre
+        filewrite.write("<li class=\"genre\">" + ", ".join(fileread.genre) + "</li>\n")
+        # write warnings if they exist
         try:
-            filewrite.write("<p class=\"summary\">" + fileread.summary + "</p>\n")
+            filewrite.write("<li class=\"warnings\">" + fileread.warnings + "</li>\n")
         except:
             pass
-    # set up notes paragraph if required
-    if (fileread.datewords[0])["date"].year < 2011:
-        juvenilia = True
-    else:
-        juvenilia = False
-    try:
-        if fileread.notes:
-            filewrite.write("<p class=\"note\">")
-    except:
+        # write point in canon if there is one
         try:
-            if fileread.event:
-                filewrite.write("<p class=\"note\">")
+            filewrite.write("<li class=\"time\">" + fileread.time + "</li>\n")
         except:
-            if juvenilia:
-                filewrite.write("<p class=\"note\">")
-    # if juvenilia, add age
-    if juvenilia:
-        age = relativedelta((fileread.datewords[0])["date"], datetime.datetime(1993,6,28)).years
-        filewrite.write("Age at time of writing: " + str(age) + ".")
+            pass
+        # write locations if there are any
         try:
-            if fileread.notes:
-                filewrite.write(" ")
+            filewrite.write("<li class=\"location\">" + fileread.locationtext + "</li>\n")
         except:
-            pass
-    # write event details if there are any
-    try:
-        if fileread.eventname == "fail-fandomanon":
-            filewrite.write("In response to prompt at <span style=\"white-space: nowrap;\" class=\"ljuser\"><a href=\"https://fail-fandomanon.dreamwidth.org/profile\"><img src=\"https://www.dreamwidth.org/img/silk/identity/community.png\" alt=\"[community profile]\" width=\"17\" height=\"17\" style=\"vertical-align: text-bottom; border: 0; padding-right: 1px;\"></a><a href=\"https://fail-fandomanon.dreamwidth.org/\"><b>fail_fandomanon</b></a></span>: <i>" + fileread.prompt + "</i>.")
             try:
-                if fileread.notes:
-                    filewrite.write(" ")
+                filewrite.write("<li class=\"location\">" + ", ".join(fileread.location) + "</li>\n")
             except:
                 pass
-        elif fileread.eventname == "robotsoup":
-            filewrite.write("Written for <span style=\"white-space: nowrap;\" class=\"ljuser\"><a href=\"https://kalloway.dreamwidth.org/profile\"><img src=\"https://www.dreamwidth.org/img/silk/identity/user.png\" alt=\"[personal profile]\" width=\"17\" height=\"17\" style=\"vertical-align: text-bottom; border: 0; padding-right: 1px;\"></a><a href=\"https://kalloway.dreamwidth.org/\"><b>kalloway</b></a></span>’s " + fileread.eventdeets + " fest.")
+        filewrite.write("</ul>\n")
+        # write summary if there is one
+        try:
+            if transread.language == "en":
+                try:
+                    filewrite.write("<p class=\"summary\">" + transread.summary)
+                    try:
+                        filewrite.write(" " + fileread.summary + "</p>\n")
+                    except:
+                        filewrite.write("</p>\n")
+                except:
+                    try:
+                        filewrite.write("<p class=\"summary\">" + fileread.summary + "</p>\n")
+                    except:
+                        pass
+            elif transread.language == "fr":
+                try:
+                    filewrite.write("<p class=\"summary\">" + fileread.summary)
+                    try:
+                        filewrite.write(" " + transread.summary + "</p>\n")
+                    except:
+                        filewrite.write("</p>\n")
+                except:
+                    try:
+                        filewrite.write("<p class=\"summary\">" + transread.summary + "</p>\n")
+                    except:
+                        pass
+        except:
             try:
-                if fileread.notes:
-                    filewrite.write(" ")
+                filewrite.write("<p class=\"summary\">" + fileread.summary + "</p>\n")
             except:
                 pass
+        # set up notes paragraph if required
+        if (fileread.datewords[0])["date"].year < 2011:
+            juvenilia = True
         else:
-            filewrite.write("Written for ")
+            juvenilia = False
+        try:
+            if fileread.notes:
+                filewrite.write("<p class=\"note\">")
+        except:
             try:
-                if fileread.eventlocation == "dwcomm":
-                    filewrite.write("<span style=\"white-space: nowrap;\" class=\"ljuser\"><a href=\"https://" + fileread.eventname.replace("_","-") + ".dreamwidth.org/profile\"><img src=\"https://www.dreamwidth.org/img/silk/identity/community.png\" alt=\"[community profile]\" width=\"17\" height=\"17\" style=\"vertical-align: text-bottom; border: 0; padding-right: 1px;\"></a><a href=\"https://" + fileread.eventname.replace("_","-") + ".dreamwidth.org/\"><b>" + fileread.eventname.replace("-","_") + "</b></a></span>")
-                elif fileread.eventlocation == "dwjournal":
-                    filewrite.write("<span style=\"white-space: nowrap;\" class=\"ljuser\"><a href=\"https://" + fileread.eventname.replace("_","-") + ".dreamwidth.org/profile\"><img src=\"https://www.dreamwidth.org/img/silk/identity/user.png\" alt=\"[personal profile]\" width=\"17\" height=\"17\" style=\"vertical-align: text-bottom; border: 0; padding-right: 1px;\"></a><a href=\"https://"+ fileread.eventname.replace("_","-") + ".dreamwidth.org/\"><b>" + fileread.eventname.replace("-","_")+ "</b></a></span>")
-                elif fileread.eventlocation == "ljjournal":
-                    filewrite.write("<span style=\"white-space: nowrap;\" class=\"ljuser\"><a href=\"https://" + fileread.eventname.replace("_","-") + ".livejournal.com/profile\"><img src=\"https://www.dreamwidth.org/img/external/lj-userinfo.gif\" alt=\"[personal profile]\" width=\"17\" height=\"17\" style=\"vertical-align: text-bottom; border: 0; padding-right: 1px;\"></a><a href=\"https://"+ fileread.eventname.replace("_","-") + ".livejournal.com/\"><b>" + fileread.eventname.replace("-","_")+ "</b></a></span>")
+                if fileread.event:
+                    filewrite.write("<p class=\"note\">")
             except:
-                if fileread.eventname == "Semaine de la fic française":
-                    filewrite.write("<i>Semaine de la fic française</i>")
-                else:
-                    filewrite.write(fileread.eventname)
+                if juvenilia:
+                    filewrite.write("<p class=\"note\">")
+        # if juvenilia, add age
+        if juvenilia:
+            age = relativedelta((fileread.datewords[0])["date"], datetime.datetime(1993,6,28)).years
+            filewrite.write("Age at time of writing: " + str(age) + ".")
             try:
-                if fileread.eventfrequency == "annual":
-                    filewrite.write(" " + str((fileread.datewords[0])["date"].year))
-                else:
-                    filewrite.write(" " + fileread.eventfrequency)
+                if fileread.notes:
+                    filewrite.write(" ")
             except:
                 pass
-            if fileread.event == "prompt":
-                filewrite.write(", in response to ")
-                try:
-                    if fileread.recip:
-                        try:
-                            if fileread.recipsite == "dw":
-                                filewrite.write("<span style=\"white-space: nowrap;\" class=\"ljuser\"><a href=\"https://" + fileread.recip.replace("_","-") + ".dreamwidth.org/profile\"><img src=\"https://www.dreamwidth.org/img/silk/identity/user.png\" alt=\"[personal profile]\" width=\"17\" height=\"17\" style=\"vertical-align: text-bottom; border: 0; padding-right: 1px;\"></a><a href=\"https://"+ fileread.recip.replace("_","-") + ".dreamwidth.org/\"><b>" + fileread.recip.replace("-","_") + "</b></a></span>")
-                            elif fileread.recipsite == "ao3":
-                                try:
-                                    if fileread.recippseud:
-                                        filewrite.write("<span style=\"white-space: nowrap;\" class=\"ljuser\"><a href=\"https://archiveofourown.org/users/" + fileread.recip + "/profile\"><img src=\"https://p.dreamwidth.org/b164c54b26e4/-/archiveofourown.org/favicon.ico\" alt=\"[archiveofourown.org profile]\" width=\"16\" height=\"16\" style=\"vertical-align: text-bottom; border: 0; padding-right: 1px;\"></a><a href=\"https://archiveofourown.org/users/"+ fileread.recip + "/pseuds/" + fileread.recippseud.replace(" ","%20") + "\"><b>" + fileread.recippseud + " (" + fileread.recip + ")</b></a></span>")
-                                except:
-                                    filewrite.write("<span style=\"white-space: nowrap;\" class=\"ljuser\"><a href=\"https://archiveofourown.org/users/" + fileread.recip + "/profile\"><img src=\"https://p.dreamwidth.org/b164c54b26e4/-/archiveofourown.org/favicon.ico\" alt=\"[archiveofourown.org profile]\" width=\"16\" height=\"16\" style=\"vertical-align: text-bottom; border: 0; padding-right: 1px;\"></a><a href=\"https://archiveofourown.org/users/"+ fileread.recip + "\"><b>" + fileread.recip + "</b></a></span>")
-                            elif fileread.recipsite == "tumblr":
-                                filewrite.write("<span style=\"white-space: nowrap;\"><a href=\"https://" + fileread.recip + ".tumblr.com\"><img src=\"https://www.tumblr.com/favicon.ico\" alt=\"[tumblr.com profile]\" style=\"vertical-align: text-bottom; border: 0; padding-right: 1px;\" width=\"16\" height=\"16\"></a><a href=\"https://" + fileread.recip + ".tumblr.com\"><b>" + fileread.recip + "</b></a></span>")
-                        except:
-                            filewrite.write(fileread.recip)
-                        filewrite.write("’s ")
-                except:
-                    pass
-                filewrite.write("prompt, <i>" + fileread.prompt + "</i>.")
+        # write event details if there are any
+        try:
+            if fileread.eventname == "fail-fandomanon":
+                filewrite.write("In response to prompt at <span style=\"white-space: nowrap;\" class=\"ljuser\"><a href=\"https://fail-fandomanon.dreamwidth.org/profile\"><img src=\"https://www.dreamwidth.org/img/silk/identity/community.png\" alt=\"[community profile]\" width=\"17\" height=\"17\" style=\"vertical-align: text-bottom; border: 0; padding-right: 1px;\"></a><a href=\"https://fail-fandomanon.dreamwidth.org/\"><b>fail_fandomanon</b></a></span>: <i>" + fileread.prompt + "</i>.")
                 try:
                     if fileread.notes:
                         filewrite.write(" ")
                 except:
                     pass
-            elif fileread.event == "exchange" or fileread.event == "ao3exchange":
-                filewrite.write(", a gift for ")
-                try:
-                    if fileread.recipsite == "dw":
-                        filewrite.write("<span style=\"white-space: nowrap;\" class=\"ljuser\"><a href=\"https://" + fileread.recip.replace("_","-") + ".dreamwidth.org/profile\"><img src=\"https://www.dreamwidth.org/img/silk/identity/user.png\" alt=\"[personal profile]\" width=\"17\" height=\"17\" style=\"vertical-align: text-bottom; border: 0; padding-right: 1px;\"></a><a href=\"https://"+ fileread.recip.replace("_","-") + ".dreamwidth.org/\"><b>" + fileread.recip.replace("-","_") + "</b></a></span>")
-                    elif fileread.recipsite == "ao3":
-                        try:
-                            if fileread.recippseud:
-                                filewrite.write("<span style=\"white-space: nowrap;\" class=\"ljuser\"><a href=\"https://archiveofourown.org/users/" + fileread.recip + "/profile\"><img src=\"https://p.dreamwidth.org/b164c54b26e4/-/archiveofourown.org/favicon.ico\" alt=\"[archiveofourown.org profile]\" width=\"16\" height=\"16\" style=\"vertical-align: text-bottom; border: 0; padding-right: 1px;\"></a><a href=\"https://archiveofourown.org/users/"+ fileread.recip + "/pseuds/" + fileread.recippseud.replace(" ","%20") + "\"><b>" + fileread.recippseud + " (" + fileread.recip + ")</b></a></span>")
-                        except:
-                            filewrite.write("<span style=\"white-space: nowrap;\" class=\"ljuser\"><a href=\"https://archiveofourown.org/users/" + fileread.recip + "/profile\"><img src=\"https://p.dreamwidth.org/b164c54b26e4/-/archiveofourown.org/favicon.ico\" alt=\"[archiveofourown.org profile]\" width=\"16\" height=\"16\" style=\"vertical-align: text-bottom; border: 0; padding-right: 1px;\"></a><a href=\"https://archiveofourown.org/users/" + fileread.recip + "\"><b>" + fileread.recip + "</b></a></span>")
-                    elif fileread.recipsite == "tumblr":
-                        filewrite.write("<span style=\"white-space: nowrap;\"><a href=\"https://" + fileread.recip + ".tumblr.com\"><img src=\"https://www.tumblr.com/favicon.ico\" alt=\"[tumblr.com profile]\" style=\"vertical-align: text-bottom; border: 0; padding-right: 1px;\" width=\"16\" height=\"16\"></a><a href=\"https://" + fileread.recip + ".tumblr.com\"><b>" + fileread.recip + "</b></a></span>")
-                except:
-                    filewrite.write(fileread.recip)
-                filewrite.write(".")
+            elif fileread.eventname == "robotsoup":
+                filewrite.write("Written for <span style=\"white-space: nowrap;\" class=\"ljuser\"><a href=\"https://kalloway.dreamwidth.org/profile\"><img src=\"https://www.dreamwidth.org/img/silk/identity/user.png\" alt=\"[personal profile]\" width=\"17\" height=\"17\" style=\"vertical-align: text-bottom; border: 0; padding-right: 1px;\"></a><a href=\"https://kalloway.dreamwidth.org/\"><b>kalloway</b></a></span>’s " + fileread.eventdeets + " fest.")
                 try:
                     if fileread.notes:
                         filewrite.write(" ")
                 except:
                     pass
             else:
-                filewrite.write(".")
+                filewrite.write("Written for ")
                 try:
-                    if fileread.notes:
-                        filewrite.write(" ")
+                    if fileread.eventlocation == "dwcomm":
+                        filewrite.write("<span style=\"white-space: nowrap;\" class=\"ljuser\"><a href=\"https://" + fileread.eventname.replace("_","-") + ".dreamwidth.org/profile\"><img src=\"https://www.dreamwidth.org/img/silk/identity/community.png\" alt=\"[community profile]\" width=\"17\" height=\"17\" style=\"vertical-align: text-bottom; border: 0; padding-right: 1px;\"></a><a href=\"https://" + fileread.eventname.replace("_","-") + ".dreamwidth.org/\"><b>" + fileread.eventname.replace("-","_") + "</b></a></span>")
+                    elif fileread.eventlocation == "dwjournal":
+                        filewrite.write("<span style=\"white-space: nowrap;\" class=\"ljuser\"><a href=\"https://" + fileread.eventname.replace("_","-") + ".dreamwidth.org/profile\"><img src=\"https://www.dreamwidth.org/img/silk/identity/user.png\" alt=\"[personal profile]\" width=\"17\" height=\"17\" style=\"vertical-align: text-bottom; border: 0; padding-right: 1px;\"></a><a href=\"https://"+ fileread.eventname.replace("_","-") + ".dreamwidth.org/\"><b>" + fileread.eventname.replace("-","_")+ "</b></a></span>")
+                    elif fileread.eventlocation == "ljjournal":
+                        filewrite.write("<span style=\"white-space: nowrap;\" class=\"ljuser\"><a href=\"https://" + fileread.eventname.replace("_","-") + ".livejournal.com/profile\"><img src=\"https://www.dreamwidth.org/img/external/lj-userinfo.gif\" alt=\"[personal profile]\" width=\"17\" height=\"17\" style=\"vertical-align: text-bottom; border: 0; padding-right: 1px;\"></a><a href=\"https://"+ fileread.eventname.replace("_","-") + ".livejournal.com/\"><b>" + fileread.eventname.replace("-","_")+ "</b></a></span>")
+                except:
+                    if fileread.eventname == "Semaine de la fic française":
+                        filewrite.write("<i>Semaine de la fic française</i>")
+                    else:
+                        filewrite.write(fileread.eventname)
+                try:
+                    if fileread.eventfrequency == "annual":
+                        filewrite.write(" " + str((fileread.datewords[0])["date"].year))
+                    else:
+                        filewrite.write(" " + fileread.eventfrequency)
                 except:
                     pass
-    except:
-        pass
-    # write notes if there are any
-    try:
-        filewrite.write(fileread.notes + "</p>\n")
-    except:
+                if fileread.event == "prompt":
+                    filewrite.write(", in response to ")
+                    try:
+                        if fileread.recip:
+                            try:
+                                if fileread.recipsite == "dw":
+                                    filewrite.write("<span style=\"white-space: nowrap;\" class=\"ljuser\"><a href=\"https://" + fileread.recip.replace("_","-") + ".dreamwidth.org/profile\"><img src=\"https://www.dreamwidth.org/img/silk/identity/user.png\" alt=\"[personal profile]\" width=\"17\" height=\"17\" style=\"vertical-align: text-bottom; border: 0; padding-right: 1px;\"></a><a href=\"https://"+ fileread.recip.replace("_","-") + ".dreamwidth.org/\"><b>" + fileread.recip.replace("-","_") + "</b></a></span>")
+                                elif fileread.recipsite == "ao3":
+                                    try:
+                                        if fileread.recippseud:
+                                            filewrite.write("<span style=\"white-space: nowrap;\" class=\"ljuser\"><a href=\"https://archiveofourown.org/users/" + fileread.recip + "/profile\"><img src=\"https://p.dreamwidth.org/b164c54b26e4/-/archiveofourown.org/favicon.ico\" alt=\"[archiveofourown.org profile]\" width=\"16\" height=\"16\" style=\"vertical-align: text-bottom; border: 0; padding-right: 1px;\"></a><a href=\"https://archiveofourown.org/users/"+ fileread.recip + "/pseuds/" + fileread.recippseud.replace(" ","%20") + "\"><b>" + fileread.recippseud + " (" + fileread.recip + ")</b></a></span>")
+                                    except:
+                                        filewrite.write("<span style=\"white-space: nowrap;\" class=\"ljuser\"><a href=\"https://archiveofourown.org/users/" + fileread.recip + "/profile\"><img src=\"https://p.dreamwidth.org/b164c54b26e4/-/archiveofourown.org/favicon.ico\" alt=\"[archiveofourown.org profile]\" width=\"16\" height=\"16\" style=\"vertical-align: text-bottom; border: 0; padding-right: 1px;\"></a><a href=\"https://archiveofourown.org/users/"+ fileread.recip + "\"><b>" + fileread.recip + "</b></a></span>")
+                                elif fileread.recipsite == "tumblr":
+                                    filewrite.write("<span style=\"white-space: nowrap;\"><a href=\"https://" + fileread.recip + ".tumblr.com\"><img src=\"https://www.tumblr.com/favicon.ico\" alt=\"[tumblr.com profile]\" style=\"vertical-align: text-bottom; border: 0; padding-right: 1px;\" width=\"16\" height=\"16\"></a><a href=\"https://" + fileread.recip + ".tumblr.com\"><b>" + fileread.recip + "</b></a></span>")
+                            except:
+                                filewrite.write(fileread.recip)
+                            filewrite.write("’s ")
+                    except:
+                        pass
+                    filewrite.write("prompt, <i>" + fileread.prompt + "</i>.")
+                    try:
+                        if fileread.notes:
+                            filewrite.write(" ")
+                    except:
+                        pass
+                elif fileread.event == "exchange" or fileread.event == "ao3exchange":
+                    filewrite.write(", a gift for ")
+                    try:
+                        if fileread.recipsite == "dw":
+                            filewrite.write("<span style=\"white-space: nowrap;\" class=\"ljuser\"><a href=\"https://" + fileread.recip.replace("_","-") + ".dreamwidth.org/profile\"><img src=\"https://www.dreamwidth.org/img/silk/identity/user.png\" alt=\"[personal profile]\" width=\"17\" height=\"17\" style=\"vertical-align: text-bottom; border: 0; padding-right: 1px;\"></a><a href=\"https://"+ fileread.recip.replace("_","-") + ".dreamwidth.org/\"><b>" + fileread.recip.replace("-","_") + "</b></a></span>")
+                        elif fileread.recipsite == "ao3":
+                            try:
+                                if fileread.recippseud:
+                                    filewrite.write("<span style=\"white-space: nowrap;\" class=\"ljuser\"><a href=\"https://archiveofourown.org/users/" + fileread.recip + "/profile\"><img src=\"https://p.dreamwidth.org/b164c54b26e4/-/archiveofourown.org/favicon.ico\" alt=\"[archiveofourown.org profile]\" width=\"16\" height=\"16\" style=\"vertical-align: text-bottom; border: 0; padding-right: 1px;\"></a><a href=\"https://archiveofourown.org/users/"+ fileread.recip + "/pseuds/" + fileread.recippseud.replace(" ","%20") + "\"><b>" + fileread.recippseud + " (" + fileread.recip + ")</b></a></span>")
+                            except:
+                                filewrite.write("<span style=\"white-space: nowrap;\" class=\"ljuser\"><a href=\"https://archiveofourown.org/users/" + fileread.recip + "/profile\"><img src=\"https://p.dreamwidth.org/b164c54b26e4/-/archiveofourown.org/favicon.ico\" alt=\"[archiveofourown.org profile]\" width=\"16\" height=\"16\" style=\"vertical-align: text-bottom; border: 0; padding-right: 1px;\"></a><a href=\"https://archiveofourown.org/users/" + fileread.recip + "\"><b>" + fileread.recip + "</b></a></span>")
+                        elif fileread.recipsite == "tumblr":
+                            filewrite.write("<span style=\"white-space: nowrap;\"><a href=\"https://" + fileread.recip + ".tumblr.com\"><img src=\"https://www.tumblr.com/favicon.ico\" alt=\"[tumblr.com profile]\" style=\"vertical-align: text-bottom; border: 0; padding-right: 1px;\" width=\"16\" height=\"16\"></a><a href=\"https://" + fileread.recip + ".tumblr.com\"><b>" + fileread.recip + "</b></a></span>")
+                    except:
+                        filewrite.write(fileread.recip)
+                    filewrite.write(".")
+                    try:
+                        if fileread.notes:
+                            filewrite.write(" ")
+                    except:
+                        pass
+                else:
+                    filewrite.write(".")
+                    try:
+                        if fileread.notes:
+                            filewrite.write(" ")
+                    except:
+                        pass
+        except:
+            pass
+        # write notes if there are any
         try:
-            if fileread.event:
-                filewrite.write("</p>\n")
+            filewrite.write(fileread.notes + "</p>\n")
         except:
-            if juvenilia:
-                filewrite.write("</p>\n")
-    filewrite.write("<ul class=\"ficlinks")
-    # specify language if necessary
-    try:
-        if fileread.translation:
-            if fileread.language == "en":
-                filewrite.write(" english")
-            elif fileread.language == "fr":
-                filewrite.write (" french")
-    except:
-        pass
-    filewrite.write("\">\n")
-    # write html link if there is one
-    if fileread.html:
-        filewrite.write("<li class=\"prazelink\"><a ")
-        if fileread.locked:
-            filewrite.write("class=\"locked\" href=\"")
-            if local:
-                filewrite.write("/home/mdd/Documents/drive/proj/fic-archive/build/secret/")
-            else:
-                filewrite.write("/fic/secret/")
-        else:
-            if local:
-                filewrite.write("href=\"/home/mdd/Documents/drive/proj/fic-archive/build/files/")
-            else:
-                filewrite.write("href=\"/fic/files/")
-        filewrite.write(ficnostring + ".html\">HTML</a></li>\n")
-    # write pdf link if there is one
-    if fileread.pdf:
-        filewrite.write("<li class=\"prazelink\"><a ")
-        if fileread.locked:
-            filewrite.write("class=\"locked\" href=\"")
-            if local:
-                filewrite.write("/home/mdd/Documents/drive/proj/fic-archive/build/secret/")
-            else:
-                filewrite.write("/fic/secret/")
-        else:
-            if local:
-                filewrite.write("href=\"/home/mdd/Documents/drive/proj/fic-archive/build/files/")
+            try:
+                if fileread.event:
+                    filewrite.write("</p>\n")
+            except:
+                if juvenilia:
+                    filewrite.write("</p>\n")
+        filewrite.write("<ul class=\"ficlinks")
+        # specify language if necessary
+        try:
+            if fileread.translation:
+                if fileread.language == "en":
+                    filewrite.write(" english")
+                elif fileread.language == "fr":
+                    filewrite.write (" french")
+        except:
+            pass
+        filewrite.write("\">\n")
+        # write html link if there is one
+        if fileread.html:
+            filewrite.write("<li class=\"prazelink\"><a ")
+            if fileread.locked:
+                filewrite.write("class=\"locked\" href=\"")
+                if local:
+                    filewrite.write("/home/mdd/Documents/drive/proj/fic-archive/build/secret/")
+                else:
+                    filewrite.write("/fic/secret/")
             else:
-                filewrite.write("href=\"/fic/files/")
-        filewrite.write(ficnostring + ".pdf\">PDF</a></li>\n")
-    # write epub link if there is one
-    if fileread.epub:
-        filewrite.write("<li class=\"prazelink\"><a ")
-        if fileread.locked:
-            filewrite.write("class=\"locked\" href=\"")
-            if local:
-                filewrite.write("/home/mdd/Documents/drive/proj/fic-archive/build/secret/")
+                if local:
+                    filewrite.write("href=\"/home/mdd/Documents/drive/proj/fic-archive/build/files/")
+                else:
+                    filewrite.write("href=\"/fic/files/")
+            filewrite.write(ficnostring + ".html\">HTML</a></li>\n")
+        # write pdf link if there is one
+        if fileread.pdf:
+            filewrite.write("<li class=\"prazelink\"><a ")
+            if fileread.locked:
+                filewrite.write("class=\"locked\" href=\"")
+                if local:
+                    filewrite.write("/home/mdd/Documents/drive/proj/fic-archive/build/secret/")
+                else:
+                    filewrite.write("/fic/secret/")
             else:
-                filewrite.write("/fic/secret/")
-        else:
-            if local:
-                filewrite.write("href=\"/home/mdd/Documents/drive/proj/fic-archive/build/files/")
+                if local:
+                    filewrite.write("href=\"/home/mdd/Documents/drive/proj/fic-archive/build/files/")
+                else:
+                    filewrite.write("href=\"/fic/files/")
+            filewrite.write(ficnostring + ".pdf\">PDF</a></li>\n")
+        # write epub link if there is one
+        if fileread.epub:
+            filewrite.write("<li class=\"prazelink\"><a ")
+            if fileread.locked:
+                filewrite.write("class=\"locked\" href=\"")
+                if local:
+                    filewrite.write("/home/mdd/Documents/drive/proj/fic-archive/build/secret/")
+                else:
+                    filewrite.write("/fic/secret/")
             else:
-                filewrite.write("href=\"/fic/files/")
-        filewrite.write(ficnostring + ".epub\">EPUB</a></li>\n")
-    # write ao3 link if there is one
-    if fileread.ao3slug:
-        filewrite.write("<li class=\"ao3link\"><a ")
-        if fileread.locked:
-            filewrite.write("class=\"locked\" ")
-        filewrite.write("href=\"https://archiveofourown.org/works/" + str(fileread.ao3slug) + "\">AO3</a></li>\n")
-    # determine if comments page
-    if any(item in fffandoms for item in fileread.fandom):
-        filewrite.write("<li class=\"prazelink\"><a href=\"")
-        if local:
-            filewrite.write("/home/mdd/Documents/drive/proj/fic-archive/build/comments/" + ficnostring + "/index.html")
-        else:
-            filewrite.write("/fic/comments/" + ficnostring)
-        filewrite.write("\">comments</a></li>\n")
-    else:
-        timeelapsed = datetime.datetime.now() - (fileread.datewords[-1])["date"]
-        if timeelapsed.days < 730:
+                if local:
+                    filewrite.write("href=\"/home/mdd/Documents/drive/proj/fic-archive/build/files/")
+                else:
+                    filewrite.write("href=\"/fic/files/")
+            filewrite.write(ficnostring + ".epub\">EPUB</a></li>\n")
+        # write ao3 link if there is one
+        try:
+            if fileread.ao3slug:
+                filewrite.write("<li class=\"ao3link\"><a ")
+                if fileread.locked:
+                    filewrite.write("class=\"locked\" ")
+                filewrite.write("href=\"https://archiveofourown.org/works/" + str(fileread.ao3slug) + "\">AO3</a></li>\n")
+        except:
+            pass
+        # determine if comments page
+        if any(item in fffandoms for item in fileread.fandom):
             filewrite.write("<li class=\"prazelink\"><a href=\"")
             if local:
                 filewrite.write("/home/mdd/Documents/drive/proj/fic-archive/build/comments/" + ficnostring + "/index.html")
@@ -413,15 +415,35 @@ def ficgen(ficno,unique=False,output="output.html",local=False):
                 filewrite.write("/fic/comments/" + ficnostring)
             filewrite.write("\">comments</a></li>\n")
         else:
-            try:
-                if fileread.event == "ao3exchange" and (fileread.datewords[0])["date"].year > 2019:
-                    filewrite.write("<li class=\"prazelink\"><a href=\"")
-                    if local:
-                        filewrite.write("/home/mdd/Documents/drive/proj/fic-archive/build/comments/" + ficnostring + "/index.html")
-                    else:
-                        filewrite.write("/fic/comments/" + ficnostring)
-                    filewrite.write("\">comments</a></li>\n")
+            timeelapsed = datetime.datetime.now() - (fileread.datewords[-1])["date"]
+            if timeelapsed.days < 730:
+                filewrite.write("<li class=\"prazelink\"><a href=\"")
+                if local:
+                    filewrite.write("/home/mdd/Documents/drive/proj/fic-archive/build/comments/" + ficnostring + "/index.html")
                 else:
+                    filewrite.write("/fic/comments/" + ficnostring)
+                filewrite.write("\">comments</a></li>\n")
+            else:
+                try:
+                    if fileread.event == "ao3exchange" and (fileread.datewords[0])["date"].year > 2019:
+                        filewrite.write("<li class=\"prazelink\"><a href=\"")
+                        if local:
+                            filewrite.write("/home/mdd/Documents/drive/proj/fic-archive/build/comments/" + ficnostring + "/index.html")
+                        else:
+                            filewrite.write("/fic/comments/" + ficnostring)
+                        filewrite.write("\">comments</a></li>\n")
+                    else:
+                        try:
+                            if fileread.comments:
+                                filewrite.write("<li class=\"prazelink\"><a href=\"")
+                                if local:
+                                    filewrite.write("/home/mdd/Documents/drive/proj/fic-archive/build/comments/" + ficnostring + "/index.html")
+                                else:
+                                    filewrite.write("/fic/comments/" + ficnostring)
+                                filewrite.write("\">comments</a></li>\n")
+                        except:
+                            pass
+                except:
                     try:
                         if fileread.comments:
                             filewrite.write("<li class=\"prazelink\"><a href=\"")
@@ -432,88 +454,71 @@ def ficgen(ficno,unique=False,output="output.html",local=False):
                             filewrite.write("\">comments</a></li>\n")
                     except:
                         pass
-            except:
-                try:
-                    if fileread.comments:
-                        filewrite.write("<li class=\"prazelink\"><a href=\"")
+        filewrite.write("</ul>\n")
+        # write links for translation if required
+        try:
+            if fileread.translation:
+                if transread.language == "en":
+                    filewrite.write("<ul class=\"ficlinks english")
+                elif transread.language == "fr":
+                    filewrite.write("<ul class=\"ficlinks french")
+                filewrite.write("\">\n")
+                # write html link if there is one
+                if fileread.html:
+                    filewrite.write("<li class=\"prazelink\"><a ")
+                    if fileread.locked:
+                        filewrite.write("class=\"locked\" href=\"")
                         if local:
-                            filewrite.write("/home/mdd/Documents/drive/proj/fic-archive/build/comments/" + ficnostring + "/index.html")
+                            filewrite.write("/home/mdd/Documents/drive/proj/fic-archive/build/secret/")
                         else:
-                            filewrite.write("/fic/comments/" + ficnostring)
-                        filewrite.write("\">comments</a></li>\n")
-                except:
-                    pass
-    filewrite.write("</ul>\n")
-    # write links for translation if required
-    try:
-        if fileread.translation:
-            if transread.language == "en":
-                filewrite.write("<ul class=\"ficlinks english")
-            elif transread.language == "fr":
-                filewrite.write("<ul class=\"ficlinks french")
-            filewrite.write("\">\n")
-            # write html link if there is one
-            if fileread.html:
-                filewrite.write("<li class=\"prazelink\"><a ")
-                if fileread.locked:
-                    filewrite.write("class=\"locked\" href=\"")
-                    if local:
-                        filewrite.write("/home/mdd/Documents/drive/proj/fic-archive/build/secret/")
+                            filewrite.write("/fic/secret/")
                     else:
-                        filewrite.write("/fic/secret/")
-                else:
-                    if local:
-                        filewrite.write("href=\"/home/mdd/Documents/drive/proj/fic-archive/build/files/")
-                    else:
-                        filewrite.write("href=\"/fic/files/")
-                filewrite.write(translationstring + ".html\">HTML</a></li>\n")
-            # write pdf link if there is one
-            if fileread.pdf:
-                filewrite.write("<li class=\"prazelink\"><a ")
-                if fileread.locked:
-                    filewrite.write("class=\"locked\" href=\"")
-                    if local:
-                        filewrite.write("/home/mdd/Documents/drive/proj/fic-archive/build/secret/")
-                    else:
-                        filewrite.write("/fic/secret/")
-                else:
-                    if local:
-                        filewrite.write("href=\"/home/mdd/Documents/drive/proj/fic-archive/build/files/")
-                    else:
-                        filewrite.write("href=\"/fic/files/")
-                filewrite.write(translationstring + ".pdf\">PDF</a></li>\n")
-            # write epub link if there is one
-            if fileread.epub:
-                filewrite.write("<li class=\"prazelink\"><a ")
-                if fileread.locked:
-                    filewrite.write("class=\"locked\" href=\"")
-                    if local:
-                        filewrite.write("/home/mdd/Documents/drive/proj/fic-archive/build/secret/")
+                        if local:
+                            filewrite.write("href=\"/home/mdd/Documents/drive/proj/fic-archive/build/files/")
+                        else:
+                            filewrite.write("href=\"/fic/files/")
+                    filewrite.write(translationstring + ".html\">HTML</a></li>\n")
+                # write pdf link if there is one
+                if fileread.pdf:
+                    filewrite.write("<li class=\"prazelink\"><a ")
+                    if fileread.locked:
+                        filewrite.write("class=\"locked\" href=\"")
+                        if local:
+                            filewrite.write("/home/mdd/Documents/drive/proj/fic-archive/build/secret/")
+                        else:
+                            filewrite.write("/fic/secret/")
                     else:
-                        filewrite.write("/fic/secret/")
-                else:
-                    if local:
-                        filewrite.write("href=\"/home/mdd/Documents/drive/proj/fic-archive/build/files/")
+                        if local:
+                            filewrite.write("href=\"/home/mdd/Documents/drive/proj/fic-archive/build/files/")
+                        else:
+                            filewrite.write("href=\"/fic/files/")
+                    filewrite.write(translationstring + ".pdf\">PDF</a></li>\n")
+                # write epub link if there is one
+                if fileread.epub:
+                    filewrite.write("<li class=\"prazelink\"><a ")
+                    if fileread.locked:
+                        filewrite.write("class=\"locked\" href=\"")
+                        if local:
+                            filewrite.write("/home/mdd/Documents/drive/proj/fic-archive/build/secret/")
+                        else:
+                            filewrite.write("/fic/secret/")
                     else:
-                        filewrite.write("href=\"/fic/files/")
-                filewrite.write(translationstring + ".epub\">EPUB</a></li>\n")
-            # write ao3 link if there is one
-            if fileread.ao3slug:
-                filewrite.write("<li class=\"ao3link\"><a ")
-                if fileread.locked:
-                    filewrite.write("class=\"locked\" ")
-                filewrite.write("href=\"https://archiveofourown.org/works/" + str(transread.ao3slug) + "\">AO3</a></li>\n")
-            # determine if comments page required
-            if any(item in fffandoms for item in fileread.fandom):
-                filewrite.write("<li class=\"prazelink\"><a href=\"")
-                if local:
-                    filewrite.write("/home/mdd/Documents/drive/proj/fic-archive/build/comments/" + translationstring + "/index.html")
-                else:
-                    filewrite.write("/fic/comments/" + translationstring)
-                filewrite.write("\">comments</a></li>\n")
-            else:
-                timeelapsed = datetime.datetime.now() - (transread.datewords[-1])["date"]
-                if timeelapsed.days < 730:
+                        if local:
+                            filewrite.write("href=\"/home/mdd/Documents/drive/proj/fic-archive/build/files/")
+                        else:
+                            filewrite.write("href=\"/fic/files/")
+                    filewrite.write(translationstring + ".epub\">EPUB</a></li>\n")
+                # write ao3 link if there is one
+                try:
+                    if fileread.ao3slug:
+                        filewrite.write("<li class=\"ao3link\"><a ")
+                        if fileread.locked:
+                            filewrite.write("class=\"locked\" ")
+                        filewrite.write("href=\"https://archiveofourown.org/works/" + str(transread.ao3slug) + "\">AO3</a></li>\n")
+                except:
+                    pass
+                # determine if comments page required
+                if any(item in fffandoms for item in fileread.fandom):
                     filewrite.write("<li class=\"prazelink\"><a href=\"")
                     if local:
                         filewrite.write("/home/mdd/Documents/drive/proj/fic-archive/build/comments/" + translationstring + "/index.html")
@@ -521,18 +526,27 @@ def ficgen(ficno,unique=False,output="output.html",local=False):
                         filewrite.write("/fic/comments/" + translationstring)
                     filewrite.write("\">comments</a></li>\n")
                 else:
-                    try:
-                        if transread.comments:
-                            filewrite.write("<li class=\"prazelink\"><a href=\"")
-                            if local:
-                                filewrite.write("/home/mdd/Documents/drive/proj/fic-archive/build/comments/" + translationstring + "/index.html")
-                            else:
-                                filewrite.write("/fic/comments/" + translationstring)
-                            filewrite.write("\">comments</a></li>\n")
-                    except:
-                        pass
-            filewrite.write("</ul>\n")
-    except:
-        pass
-    filewrite.write("</div>\n")
-    filewrite.close()
+                    timeelapsed = datetime.datetime.now() - (transread.datewords[-1])["date"]
+                    if timeelapsed.days < 730:
+                        filewrite.write("<li class=\"prazelink\"><a href=\"")
+                        if local:
+                            filewrite.write("/home/mdd/Documents/drive/proj/fic-archive/build/comments/" + translationstring + "/index.html")
+                        else:
+                            filewrite.write("/fic/comments/" + translationstring)
+                        filewrite.write("\">comments</a></li>\n")
+                    else:
+                        try:
+                            if transread.comments:
+                                filewrite.write("<li class=\"prazelink\"><a href=\"")
+                                if local:
+                                    filewrite.write("/home/mdd/Documents/drive/proj/fic-archive/build/comments/" + translationstring + "/index.html")
+                                else:
+                                    filewrite.write("/fic/comments/" + translationstring)
+                                filewrite.write("\">comments</a></li>\n")
+                        except:
+                            pass
+                    filewrite.write("</ul>\n")
+        except:
+            pass
+        filewrite.write("</div>\n")
+        filewrite.close()
diff --git a/masterlist.py b/masterlist.py
index 6c53162..b1b5431 100644
--- a/masterlist.py
+++ b/masterlist.py
@@ -13,7 +13,7 @@ def listgen(local=False):
     if os.path.exists("build/masterlist/index.html"):
         os.remove("build/masterlist/index.html")
     # write header
-    headerfooter.headerwrite("build/masterlist/index.html","Masterlist","Fic masterlist","<p>On this page, from newest to oldest, you’ll find basically everything I’ve ever written that is a. fanfiction and b. extant; quality may vary. RPF and things I wrote before 2020 require a username and password to access; on AO3, they’re available behind the login wall.</p>",False,local)
+    headerfooter.headerwrite("build/masterlist/index.html","Masterlist","Fic masterlist","<p>On this page, from newest to oldest, you’ll find basically everything I’ve ever written that is a. fanfiction and b. extant; quality may vary. RPF and things I wrote before 2020 require a username and password to access; if they’re on AO3, they’re available behind the login wall.</p>",False,local)
     # write fic divs
     ficcount = 500
     while ficcount > 0:
diff --git a/originalsmeta/template.py b/originalsmeta/template.py
index e28100c..2b5506e 100644
--- a/originalsmeta/template.py
+++ b/originalsmeta/template.py
@@ -5,6 +5,7 @@ showtitle = False
 language = "en"
 # translation = 
 datewords = [{"date":datetime.datetime(YYYY,M,D),"words":}]
+# revealdate = datetime.datetime(YYYY,M,D)
 # approxdate = ""
 status = "complete" # incomplete, abandoned
 rating = "" # g, t, m, e
diff --git a/ships.py b/ships.py
index 3ee5dbb..482217a 100644
--- a/ships.py
+++ b/ships.py
@@ -1,4 +1,4 @@
-import os
+import datetime, os
 from importlib import import_module
 
 fffandoms = ["FF1","FF2","FF3","FF4","FF5","FF6","FF7","FF8","FF9","FFX","FF11","FF12","FF13","FF14","FF15"]
@@ -29,12 +29,20 @@ def shiplist(local=False):
             if os.path.exists("originalsmeta/" + ficcountstring + ".py"):
                 ficfile = "originalsmeta." + ficcountstring
                 fileread = import_module(ficfile)
-                if len(fileread.fandom) == 1:
-                    if fandom in fileread.fandom:
-                        try:
-                            theships.extend(fileread.ship)
-                        except:
-                            pass
+                try:
+                    if fileread.revealdate > datetime.datetime.now():
+                        revealed = False
+                    else:
+                        revealed = True
+                except:
+                    revealed = True
+                if revealed == True:
+                    if len(fileread.fandom) == 1:
+                        if fandom in fileread.fandom:
+                            try:
+                                theships.extend(fileread.ship)
+                            except:
+                                pass
         for ship in theships:
             if ship == None:
                 theships.remove(ship)
@@ -62,15 +70,23 @@ def shiplist(local=False):
             if os.path.exists("originalsmeta/" + ficcountstring + ".py"):
                 countfile = "originalsmeta." + ficcountstring
                 fileread = import_module(countfile)
-                if searchfandom in fileread.fandom:
-                    # append to lists
-                    try:
-                        if fileread.ship[0] == ship:
-                            maincount.append(ficcount)
-                        elif ship in fileread.ship:
-                            secondarycount.append(ficcount)
-                    except:
-                        pass
+                try:
+                    if fileread.revealdate > datetime.datetime.now():
+                        revealed = False
+                    else:
+                        revealed = True
+                except:
+                    revealed = True
+                if revealed == True:
+                    if searchfandom in fileread.fandom:
+                        # append to lists
+                        try:
+                            if fileread.ship[0] == ship:
+                                maincount.append(ficcount)
+                            elif ship in fileread.ship:
+                                secondarycount.append(ficcount)
+                        except:
+                            pass
         # write details element
         output = "build/ff/ships/index.html"
         filewrite = open(output, "a")
diff --git a/statsgen.py b/statsgen.py
index e994d29..d6a3906 100644
--- a/statsgen.py
+++ b/statsgen.py
@@ -230,9 +230,17 @@ def yeargen(local=False):
         else:
             fileread = False
         if fileread:
-            for date in fileread.datewords:
-                yearlist.append(date["date"].year)
-                yearlist = sorted(list(dict.fromkeys(yearlist)))
+            try:
+                if fileread.revealdate > datetime.datetime.now():
+                    revealed = False
+                else:
+                    revealed = True
+            except:
+                revealed = True
+            if revealed == True:
+                for date in fileread.datewords:
+                    yearlist.append(date["date"].year)
+                    yearlist = sorted(list(dict.fromkeys(yearlist)))
     for year in yearlist:
         yearpath = "build/stats/" + str(year)
         if not os.path.isdir(yearpath):
@@ -267,9 +275,17 @@ def yeargen(local=False):
             else:
                 fileread = False
             if fileread:
-                for date in fileread.datewords:
-                    if (date["date"]).year == year:
-                        allfics.append(ficcountstring)
+                try:
+                    if fileread.revealdate > datetime.datetime.now():
+                        revealed = False
+                    else:
+                        revealed = True
+                except:
+                    revealed = True
+                if revealed == True:
+                    for date in fileread.datewords:
+                        if (date["date"]).year == year:
+                            allfics.append(ficcountstring)
         allfics = sorted(list(dict.fromkeys(allfics)))
         for fic in allfics:
             if os.path.exists("originalsmeta/" + fic + ".py"):
@@ -282,41 +298,49 @@ def yeargen(local=False):
                 fileread = False
             if fileread:
                 try:
-                    fandom = fileread.fandom
-                    event = fileread.event
-                    eventname = fileread.eventname
-                    try:
-                        eventlocation = fileread.eventlocation
-                    except:
-                        eventlocation = False
+                    if fileread.revealdate > datetime.datetime.now():
+                        revealed = False
+                    else:
+                        revealed = True
                 except:
+                    revealed = True
+                if revealed == True:
                     try:
-                        if fileread.original:
-                            theorig = "originalsmeta." + str(fileread.original)
-                            origfile = import_module(theorig)
-                            try:
-                                fandom = origfile.fandom
-                                event = origfile.event
-                                eventname = origfile.eventname
+                        fandom = fileread.fandom
+                        event = fileread.event
+                        eventname = fileread.eventname
+                        try:
+                            eventlocation = fileread.eventlocation
+                        except:
+                            eventlocation = False
+                    except:
+                        try:
+                            if fileread.original:
+                                theorig = "originalsmeta." + str(fileread.original)
+                                origfile = import_module(theorig)
                                 try:
-                                    eventlocation = fileread.eventlocation
+                                    fandom = origfile.fandom
+                                    event = origfile.event
+                                    eventname = origfile.eventname
+                                    try:
+                                        eventlocation = fileread.eventlocation
+                                    except:
+                                        eventlocation = False
                                 except:
+                                    event = False
+                                    eventname = False
                                     eventlocation = False
-                            except:
-                                event = False
-                                eventname = False
-                                eventlocation = False
-                    except:
-                        event = False
-                        eventname = False
-                        eventlocation = False
-                ficwords = 0
-                for dateword in fileread.datewords:
-                    if (dateword["date"]).year == year:
-                        ficwords = (dateword["words"])
-                    ficdict = {"number":fic,"words":ficwords,"fandom":fandom,"event":event,"eventname":eventname,"eventlocation":eventlocation,"date":dateword["date"]}
-                    ficdeets.append(ficdict)
-                    datesplit.append(ficdict)
+                        except:
+                            event = False
+                            eventname = False
+                            eventlocation = False
+                    ficwords = 0
+                    for dateword in fileread.datewords:
+                        if (dateword["date"]).year == year:
+                            ficwords = (dateword["words"])
+                        ficdict = {"number":fic,"words":ficwords,"fandom":fandom,"event":event,"eventname":eventname,"eventlocation":eventlocation,"date":dateword["date"]}
+                        ficdeets.append(ficdict)
+                        datesplit.append(ficdict)
         combinedeets = []
         for fic in ficdeets:
             if combinedeets == []:
@@ -514,25 +538,33 @@ def yeargen(local=False):
             else:
                 fileread = False
             if fileread:
-                for datewords in fileread.datewords:
-                    if datewords["date"] == thedate:
-                        thewords = datewords["words"]
-                        fic["words"] = thewords
-            ficlogged = False
-            if monthcombine == []:
-                if ficlogged == False:
-                    ficlogged = True
-                    monthcombine.append(fic)
-            else:
+                try:
+                    if fileread.revealdate > datetime.datetime.now():
+                        revealed = False
+                    else:
+                        revealed = True
+                except:
+                    revealed = True
+                if revealed == True:
+                    for datewords in fileread.datewords:
+                        if datewords["date"] == thedate:
+                            thewords = datewords["words"]
+                            fic["words"] = thewords
                 ficlogged = False
-                for newfic in monthcombine:
+                if monthcombine == []:
                     if ficlogged == False:
-                        if fic["number"] == newfic["number"]:
-                            if (fic["date"]).month == (newfic["date"]).month:
-                                ficlogged = True
-                                newfic["words"] += fic["words"]
-                if ficlogged == False:
-                    monthcombine.append(fic)
+                        ficlogged = True
+                        monthcombine.append(fic)
+                else:
+                    ficlogged = False
+                    for newfic in monthcombine:
+                        if ficlogged == False:
+                            if fic["number"] == newfic["number"]:
+                                if (fic["date"]).month == (newfic["date"]).month:
+                                    ficlogged = True
+                                    newfic["words"] += fic["words"]
+                    if ficlogged == False:
+                        monthcombine.append(fic)
         jan = {"fics":[],"words":0}
         feb = {"fics":[],"words":0}
         mar = {"fics":[],"words":0}