]> git.cworth.org Git - turbot-web/blobdiff - html_generator.py
Expect all dependencies to be found from /
[turbot-web] / html_generator.py
index b944391ed2cd15745f57b1c29ac563d889b2893e..0950d6f4212db82f8b24a9874416dc992dfb6195 100644 (file)
@@ -21,6 +21,11 @@ import re
 website = "https://halibut.cworth.org/"
 #change this if we're using AWS or some other subdomain instead
 
+def filename_from_name(name):
+    """Returns a string derived from name, but with all spaces and slashes
+       replaced with underscores, (for making a clean filename)"""
+    return re.sub(r'[ /]', '_', name)
+
 def channel_url(channel_id):
     """Given a channel ID, return the URL for that channel."""
 
@@ -126,7 +131,7 @@ def overview(puzzles, rounds):
      '  <meta charset="utf-8">\n',
      '  <meta name="viewport" content="width=device-width, initial-scale=1">\n',
      '\n',
-     '  <link rel="stylesheet" href="overview.css">\n',
+     '  <link rel="stylesheet" href="/overview.css">\n',
      '  <script type="text/javascript">\n',
      '    // Hide all elements with class="containerTab", except for the one that matches the clickable grid column\n',
      '    function openTab(tabName) {\n',
@@ -140,7 +145,7 @@ def overview(puzzles, rounds):
      '  </script>\n',
      '\n',
      '  <title>Hunt Overview</title>\n',
-     '  <script src="sorttable.js"></script>\n'
+     '  <script src="/sorttable.js"></script>\n'
      '</head>\n',
      '    <div class="sidenav">\n'
      '      <a href="index.html">Hunt Overview</a>'
@@ -167,7 +172,7 @@ def overview(puzzles, rounds):
         expanding += [
         '  <div id="b{}" class="containerTab {}" style="display:none;">\n'.format(i, status),
         '    <span onclick="this.parentElement.style.display=\'none\'" class="closebtn">x</span>\n',
-        '    <h2>{}</h2>\n'.format(link(website + "_".join(rnd.split()) + "_round.html", rnd)),
+        '    <h2>{}</h2>\n'.format(link(website + filename_from_name(rnd) + "_round.html", rnd)),
         '    <table class="sortable">\n',
         '      <tr>\n',
         '        <th><u>Puzzle</u></th>\n',
@@ -181,12 +186,12 @@ def overview(puzzles, rounds):
                 meta = ''
             if puzzle['status'] == 'solved':
                 expanding += ['      <tr class=\'solved\';>\n',
-                '        <td>{}</td>\n'.format(link(website + "_".join(puzzle['name'].split()) + ".html", puzzle['name']+meta)),
+                '        <td>{}</td>\n'.format(link(website + filename_from_name(puzzle['name']) + ".html", puzzle['name']+meta)),
                 '        <td>{}</td>\n'.format(puzzle['solution']),
                 '      </tr>\n']
             else:
                 expanding += ['      <tr class=\'unsolved\';>\n',
-                '        <td><b>{}</b></td>\n'.format(link(website + "_".join(puzzle['name'].split()) + ".html", puzzle['name']+meta)),
+                '        <td><b>{}</b></td>\n'.format(link(website + filename_from_name(puzzle['name']) + ".html", puzzle['name']+meta)),
                 '        <td></td>\n',
                 '      </tr>\n']
         expanding.append('    </table>\n')
@@ -214,9 +219,9 @@ def round_overview(rnd, puzzles):
         status = 'unsolved'
     start = ['<html>\n',
      '    <head>\n',
-     '        <link rel="stylesheet" href="individual.css">\n',
+     '        <link rel="stylesheet" href="/individual.css">\n',
      '        <title>Mystery Hunt 2022</title>\n',
-     '        <script src="sorttable.js"></script>\n',
+     '        <script src="/sorttable.js"></script>\n',
      '    </head>\n',
      '    <body class="{}">\n'.format(status),
      '        <h1><b>{}</b></h1>\n'.format(rnd),
@@ -248,7 +253,7 @@ def round_overview(rnd, puzzles):
              '                        <td>{}</td>\n'.format(elink(slack_url, puzzle['name']+meta)),
              '                        <td>{}</td>\n'.format(elink(puzzle.get('url',''), 'Puzzle')),
              '                        <td>{}</td>\n'.format(elink(puzzle['sheet_url'], 'Sheet')),
-             '                        <td>{}</td>\n'.format(link(website + "_".join(puzzle['name'].split()) + '.html', 'Overview')),
+             '                        <td>{}</td>\n'.format(link(website + filename_from_name(puzzle['name']) + '.html', 'Overview')),
              '                        <td>{}</td>\n'.format(puzzle['solution']),
             # '                        <td></td>\n',
              '                        <td>{}</td>\n'.format("".join(puzzle.get('tags',[]))),
@@ -258,7 +263,7 @@ def round_overview(rnd, puzzles):
              '                        <td><b>{}</b></td>\n'.format(elink(slack_url, puzzle['name']+meta)),
              '                        <td>{}</td>\n'.format(elink(puzzle.get('url',''), 'Puzzle')),
              '                        <td>{}</td>\n'.format(elink(puzzle['sheet_url'], 'Sheet')),
-             '                        <td>{}</td>\n'.format(link(website + "_".join(puzzle['name'].split()) + '.html', 'Overview')),
+             '                        <td>{}</td>\n'.format(link(website + filename_from_name(puzzle['name']) + '.html', 'Overview')),
              '                        <td></td>\n',
             # '                        <td></td>\n',
              '                        <td>{}</td>\n'.format(" ".join(puzzle.get('tags',[]))),
@@ -269,7 +274,7 @@ def round_overview(rnd, puzzles):
     '    </body>\n',
     '</html>\n']
     html = start + puzzle_list + end
-    file = "{}_round.html".format('_'.join(rnd.split()))
+    file = "{}_round.html".format(filename_from_name(rnd))
     f = open(file, "w")
     for line in html:
         f.write(line)
@@ -286,7 +291,7 @@ def puzzle_overview(puzzle):
         meta = ''
     slack_url = channel_url(puzzle['channel_id'])
     if 'rounds' in puzzle:
-        round_url = [link(website + "_".join(rnd.split()) + "_round.html", rnd) for rnd in puzzle['rounds']]
+        round_url = [link(website + filename_from_name(rnd) + "_round.html", rnd) for rnd in puzzle['rounds']]
     else:
         round_url = ''
     if puzzle['status'] == 'solved':
@@ -300,7 +305,7 @@ def puzzle_overview(puzzle):
      '<head>\n',
      '    <meta charset="utf-8">\n',
      '    <meta name="viewport" content="width=device-width, initial-scale=1">\n',
-     '    <link rel="stylesheet" href="individual.css">\n',
+     '    <link rel="stylesheet" href="/individual.css">\n',
      '    <title>{}</title>\n'.format(name+meta),
      '    <p>{}</p>'.format(link(website + 'index.html', 'Hunt Overview')),
      '\n',
@@ -330,9 +335,7 @@ def puzzle_overview(puzzle):
      '\n',
      '</body>\n',
      '</html>\n']
-    # Replace all spaces and slashes in the name with underscores
-    underscored = re.sub(r'[ /]', '_', name)
-    file = "{}.html".format(underscored)
+    file = "{}.html".format(filename_from_name(name))
     f = open(file, "w")
     for line in html:
         f.write(line)
@@ -346,9 +349,9 @@ def puzzle_lists(puzzles, filt):
     unsolved_puzzles = [puzzle for puzzle in puzzles if puzzle['status'] != 'solved']
     start = ['<html>\n',
      '    <head>\n',
-     '        <link rel="stylesheet" href="overview.css">\n',
+     '        <link rel="stylesheet" href="/overview.css">\n',
      '        <title>Mystery Hunt 2022</title>\n',
-     '        <script src="sorttable.js"></script>\n',
+     '        <script src="/sorttable.js"></script>\n',
      '    </head>\n',
      '    <div class="sidenav">\n'
      '      <a href="index.html">Hunt Overview</a>'
@@ -382,7 +385,7 @@ def puzzle_lists(puzzles, filt):
             meta = ''
         slack_url = channel_url(puzzle['channel_id'])
         if 'rounds' in puzzle:
-            round_url = link(website + "_".join(rnd.split()) + "_round.html", puzzle['rounds'][0])
+            round_url = link(website + filename_from_name(rnd) + "_round.html", puzzle['rounds'][0])
         else:
             round_url = ''
         #assuming one round per puzzle for now
@@ -391,7 +394,7 @@ def puzzle_lists(puzzles, filt):
          '                        <td>{}</td>\n'.format(elink(slack_url, puzzle['name']+meta)),
          '                        <td>{}</td>\n'.format(elink(puzzle.get('url',''), 'Puzzle')),
          '                        <td>{}</td>\n'.format(elink(puzzle['sheet_url'], 'Sheet')),
-         '                        <td>{}</td>\n'.format(link(website + "_".join(puzzle['name'].split()) + '.html', 'Overview')),
+         '                        <td>{}</td>\n'.format(link(website + filename_from_name(puzzle['name']) + '.html', 'Overview')),
          '                        <td>{}</td>\n'.format(puzzle['solution']),
          '                        <td>{}</td>\n'.format(round_url),
          '                        <td>{}</td>\n'.format("".join(puzzle.get('tags',[]))),
@@ -403,7 +406,7 @@ def puzzle_lists(puzzles, filt):
             meta = ''
         slack_url = channel_url(puzzle['channel_id'])
         if 'rounds' in puzzle:
-            round_url = link(website + "_".join(rnd.split()) + "_round.html", puzzle['rounds'][0])
+            round_url = link(website + filename_from_name(rnd) + "_round.html", puzzle['rounds'][0])
         else:
             round_url = ''
         #assuming one round per puzzle for now
@@ -412,7 +415,7 @@ def puzzle_lists(puzzles, filt):
          '                        <td>{}</td>\n'.format(elink(slack_url, puzzle['name']+meta)),
          '                        <td>{}</td>\n'.format(elink(puzzle.get('url',''), 'Puzzle')),
          '                        <td>{}</td>\n'.format(elink(puzzle['sheet_url'], 'Sheet')),
-         '                        <td>{}</td>\n'.format(link(website + "_".join(puzzle['name'].split()) + '.html', 'Overview')),
+         '                        <td>{}</td>\n'.format(link(website + filename_from_name(puzzle['name']) + '.html', 'Overview')),
          '                        <td></td>\n',
          '                        <td>{}</td>\n'.format(round_url),
          '                        <td>{}</td>\n'.format("".join(puzzle.get('tags',[]))),