]> git.za3k.com Git - blog.git/commitdiff
Generate wordpress's tag cloud
authorZachary Vance <za3k@za3k.com>
Wed, 3 Jul 2024 17:20:06 +0000 (13:20 -0400)
committerZachary Vance <za3k@za3k.com>
Wed, 3 Jul 2024 17:20:06 +0000 (13:20 -0400)
blog
requirements.txt [new file with mode: 0644]
templates/tagcloud.mustache.html

diff --git a/blog b/blog
index 96b92daf3b5cfb2f72aed7afed6382506a59e94b..43a778e7e6fe65241fc43d47547fbb52abf8db0a 100755 (executable)
--- a/blog
+++ b/blog
@@ -15,13 +15,15 @@ Other than that I think it's pretty nice!
 """
 
 import argparse
-import yaml
 import chevron as mustache
 import collections
-from pathlib import Path
+import math
 import collections
 import os, os.path
 import sys
+import yaml
+
+from pathlib import Path
 
 import frontmatter
 import monitor
@@ -55,6 +57,7 @@ def calc_range(l):
 
 def scale(i1, range1, range2):
     frac1 = (i1 - range1.start) / (range1.stop - range1.start)
+    assert 0 <= frac1 <= 1
     frac2 = frac1
     i2 = frac2 * (range2.stop - range2.start) + range2.start
     return i2
@@ -95,7 +98,7 @@ class Templatable(PseudoMap):
         template_path = blog["{}_template".format(name)]
         with open(template_path, "r") as f:
             template = f.read()
-        return mustache.render(template, context)
+        return mustache.render(template, context, warn=True)
 
     def content(self):
         return self.render_template(self.blog, self.type, self.context).encode("utf8")
@@ -142,10 +145,15 @@ class Tag(Templatable):
     def __init__(self, tag, blog):
         super().__init__(blog)
         self.tag = tag
-        self.posts = set()
+        self._posts = set()
+        self.slug = url_slug(tag)
 
     def add_post(self, post):
-        self.posts.add(post)
+        self._posts.add(post)
+
+    @property
+    def posts(self):
+        return sorted(self._posts, key=lambda post: post.date, reverse=True)
 
     @property
     def num_posts(self):
@@ -253,9 +261,10 @@ class Blog(PseudoMap):
         self.top_tags = sorted(top_tags, key=lambda x: x.tag.lower())
 
         # Calculate the size for each tag in the cloud, storing it on the tag itself
-        post_count_range = calc_range(x.num_posts for x in top_tags)
+        tag_scaling = lambda count: round(math.log(count+1, 10) * 100 )
+        post_count_range = calc_range(tag_scaling(tag.num_posts) for tag in top_tags)
         for tag in top_tags:
-            tag.font_size = scale(tag.num_posts, post_count_range, font_sizes)
+            tag.font_size = scale(tag_scaling(tag.num_posts), post_count_range, font_sizes)
         
         return Templatable.render_template(blog, "tagcloud", self)
 
@@ -266,7 +275,7 @@ class Blog(PseudoMap):
             self.config,
         ]
         templates = [
-            x for x in self.__dict__.keys() if x.endswith("_template")
+            self[x] for x in self.__dict__.keys() if x.endswith("_template")
         ]
         global_update = templates + [
             Path(self.static_dir) / "wp-includes", 
@@ -291,6 +300,10 @@ class Blog(PseudoMap):
             #print(path, "updated, ignoring...", file=sys.stderr)
             pass
 
+    def clean(self):
+        assert self.destination
+        os.system("rm -rf \"{}\"/*".format(self.destination))
+
 if __name__ == "__main__":
     parser = argparse.ArgumentParser(
         prog="blog",
@@ -310,6 +323,7 @@ if __name__ == "__main__":
     if args.local:
         blog.web_root = ".."
     if args.all:
+        blog.clean()
         blog.generate_all()
     else:
         blog.updates_happened(args.changed_files)
diff --git a/requirements.txt b/requirements.txt
new file mode 100644 (file)
index 0000000..c2c04aa
--- /dev/null
@@ -0,0 +1,3 @@
+chevron
+pyyaml
+watchdog
index 26065947786599809572ae9abc6df301de210735..9db1f351e1770084c1609da669b41b02e974e0d4 100644 (file)
@@ -1,47 +1,6 @@
+
 <p class="wp-block-tag-cloud">
-    <a href="https://blog.za3k.com/tag/announcements/" class="tag-cloud-link tag-link-204 tag-link-position-1" style="font-size: 8pt;" aria-label="announcements (3 items)">announcements</a>
-    <a href="https://blog.za3k.com/tag/archiving/" class="tag-cloud-link tag-link-151 tag-link-position-2" style="font-size: 14.155172413793pt;" aria-label="archiving (12 items)">archiving</a>
-    <a href="https://blog.za3k.com/tag/art/" class="tag-cloud-link tag-link-39 tag-link-position-3" style="font-size: 15.965517241379pt;" aria-label="art (17 items)">art</a>
-    <a href="https://blog.za3k.com/tag/backup/" class="tag-cloud-link tag-link-18 tag-link-position-4" style="font-size: 15pt;" aria-label="backup (14 items)">backup</a>
-    <a href="https://blog.za3k.com/tag/book-review/" class="tag-cloud-link tag-link-189 tag-link-position-5" style="font-size: 9.2068965517241pt;" aria-label="book review (4 items)">book review</a>
-    <a href="https://blog.za3k.com/tag/command-line/" class="tag-cloud-link tag-link-56 tag-link-position-6" style="font-size: 8pt;" aria-label="command-line (3 items)">command-line</a>
-    <a href="https://blog.za3k.com/tag/cooking/" class="tag-cloud-link tag-link-84 tag-link-position-7" style="font-size: 8pt;" aria-label="cooking (3 items)">cooking</a>
-    <a href="https://blog.za3k.com/tag/crafts/" class="tag-cloud-link tag-link-104 tag-link-position-8" style="font-size: 9.2068965517241pt;" aria-label="crafts (4 items)">crafts</a>
-    <a href="https://blog.za3k.com/tag/dead-tree/" class="tag-cloud-link tag-link-69 tag-link-position-9" style="font-size: 9.2068965517241pt;" aria-label="dead tree (4 items)">dead tree</a>
-    <a href="https://blog.za3k.com/tag/debian/" class="tag-cloud-link tag-link-114 tag-link-position-10" style="font-size: 10.172413793103pt;" aria-label="debian (5 items)">debian</a>
-    <a href="https://blog.za3k.com/tag/email/" class="tag-cloud-link tag-link-22 tag-link-position-11" style="font-size: 9.2068965517241pt;" aria-label="email (4 items)">email</a>
-    <a href="https://blog.za3k.com/tag/game/" class="tag-cloud-link tag-link-91 tag-link-position-12" style="font-size: 9.2068965517241pt;" aria-label="game (4 items)">game</a>
-    <a href="https://blog.za3k.com/tag/game-design/" class="tag-cloud-link tag-link-92 tag-link-position-13" style="font-size: 10.172413793103pt;" aria-label="game design (5 items)">game design</a>
-    <a href="https://blog.za3k.com/tag/games/" class="tag-cloud-link tag-link-60 tag-link-position-14" style="font-size: 15.965517241379pt;" aria-label="games (17 items)">games</a>
-    <a href="https://blog.za3k.com/tag/hack-a-day/" class="tag-cloud-link tag-link-228 tag-link-position-15" style="font-size: 22pt;" aria-label="hack-a-day (57 items)">hack-a-day</a>
-    <a href="https://blog.za3k.com/tag/hacks/" class="tag-cloud-link tag-link-32 tag-link-position-16" style="font-size: 9.2068965517241pt;" aria-label="hacks (4 items)">hacks</a>
-    <a href="https://blog.za3k.com/tag/hardware/" class="tag-cloud-link tag-link-136 tag-link-position-17" style="font-size: 12.224137931034pt;" aria-label="hardware (8 items)">hardware</a>
-    <a href="https://blog.za3k.com/tag/linux/" class="tag-cloud-link tag-link-17 tag-link-position-18" style="font-size: 18.741379310345pt;" aria-label="linux (30 items)">linux</a>
-    <a href="https://blog.za3k.com/tag/minecraft-2/" class="tag-cloud-link tag-link-8 tag-link-position-19" style="font-size: 9.2068965517241pt;" aria-label="minecraft (4 items)">minecraft</a>
-    <a href="https://blog.za3k.com/tag/music/" class="tag-cloud-link tag-link-36 tag-link-position-20" style="font-size: 11.620689655172pt;" aria-label="music (7 items)">music</a>
-    <a href="https://blog.za3k.com/tag/november/" class="tag-cloud-link tag-link-227 tag-link-position-21" style="font-size: 18.01724137931pt;" aria-label="november (26 items)">november</a>
-    <a href="https://blog.za3k.com/tag/organization/" class="tag-cloud-link tag-link-105 tag-link-position-22" style="font-size: 9.2068965517241pt;" aria-label="organization (4 items)">organization</a>
-    <a href="https://blog.za3k.com/tag/physical/" class="tag-cloud-link tag-link-71 tag-link-position-23" style="font-size: 9.2068965517241pt;" aria-label="physical (4 items)">physical</a>
-    <a href="https://blog.za3k.com/tag/piskell/" class="tag-cloud-link tag-link-109 tag-link-position-24" style="font-size: 9.2068965517241pt;" aria-label="piskell (4 items)">piskell</a>
-    <a href="https://blog.za3k.com/tag/pixel-art/" class="tag-cloud-link tag-link-37 tag-link-position-25" style="font-size: 11.620689655172pt;" aria-label="pixel art (7 items)">pixel art</a>
-    <a href="https://blog.za3k.com/tag/programming/" class="tag-cloud-link tag-link-47 tag-link-position-26" style="font-size: 11.01724137931pt;" aria-label="programming (6 items)">programming</a>
-    <a href="https://blog.za3k.com/tag/publishing/" class="tag-cloud-link tag-link-68 tag-link-position-27" style="font-size: 9.2068965517241pt;" aria-label="publishing (4 items)">publishing</a>
-    <a href="https://blog.za3k.com/tag/puzzles/" class="tag-cloud-link tag-link-275 tag-link-position-28" style="font-size: 8pt;" aria-label="puzzles (3 items)">puzzles</a>
-    <a href="https://blog.za3k.com/tag/recipe/" class="tag-cloud-link tag-link-87 tag-link-position-29" style="font-size: 10.172413793103pt;" aria-label="recipe (5 items)">recipe</a>
-    <a href="https://blog.za3k.com/tag/research/" class="tag-cloud-link tag-link-212 tag-link-position-30" style="font-size: 11.01724137931pt;" aria-label="research (6 items)">research</a>
-    <a href="https://blog.za3k.com/tag/review/" class="tag-cloud-link tag-link-190 tag-link-position-31" style="font-size: 11.620689655172pt;" aria-label="review (7 items)">review</a>
-    <a href="https://blog.za3k.com/tag/self-improvement/" class="tag-cloud-link tag-link-98 tag-link-position-32" style="font-size: 11.01724137931pt;" aria-label="self-improvement (6 items)">self-improvement</a>
-    <a href="https://blog.za3k.com/tag/software/" class="tag-cloud-link tag-link-137 tag-link-position-33" style="font-size: 10.172413793103pt;" aria-label="software (5 items)">software</a>
-    <a href="https://blog.za3k.com/tag/storage/" class="tag-cloud-link tag-link-173 tag-link-position-34" style="font-size: 9.2068965517241pt;" aria-label="storage (4 items)">storage</a>
-    <a href="https://blog.za3k.com/tag/system-administration/" class="tag-cloud-link tag-link-14 tag-link-position-35" style="font-size: 15.241379310345pt;" aria-label="system administration (15 items)">system administration</a>
-    <a href="https://blog.za3k.com/tag/throwaway/" class="tag-cloud-link tag-link-229 tag-link-position-36" style="font-size: 19.827586206897pt;" aria-label="throwaway (37 items)">throwaway</a>
-    <a href="https://blog.za3k.com/tag/timelog/" class="tag-cloud-link tag-link-158 tag-link-position-37" style="font-size: 9.2068965517241pt;" aria-label="timelog (4 items)">timelog</a>
-    <a href="https://blog.za3k.com/tag/video/" class="tag-cloud-link tag-link-259 tag-link-position-38" style="font-size: 8pt;" aria-label="video (3 items)">video</a>
-    <a href="https://blog.za3k.com/tag/video-game/" class="tag-cloud-link tag-link-248 tag-link-position-39" style="font-size: 11.01724137931pt;" aria-label="video game (6 items)">video game</a>
-    <a href="https://blog.za3k.com/tag/video-games/" class="tag-cloud-link tag-link-59 tag-link-position-40" style="font-size: 12.827586206897pt;" aria-label="video games (9 items)">video games</a>
-    <a href="https://blog.za3k.com/tag/website/" class="tag-cloud-link tag-link-57 tag-link-position-41" style="font-size: 13.793103448276pt;" aria-label="website (11 items)">website</a>
-    <a href="https://blog.za3k.com/tag/websites/" class="tag-cloud-link tag-link-41 tag-link-position-42" style="font-size: 9.2068965517241pt;" aria-label="websites (4 items)">websites</a>
-    <a href="https://blog.za3k.com/tag/wikipedia/" class="tag-cloud-link tag-link-269 tag-link-position-43" style="font-size: 8pt;" aria-label="wikipedia (3 items)">wikipedia</a>
-    <a href="https://blog.za3k.com/tag/yearly-review/" class="tag-cloud-link tag-link-191 tag-link-position-44" style="font-size: 11.01724137931pt;" aria-label="yearly review (6 items)">yearly review</a>
-    <a href="https://blog.za3k.com/tag/zorchpad/" class="tag-cloud-link tag-link-282 tag-link-position-45" style="font-size: 11.01724137931pt;" aria-label="zorchpad (6 items)">zorchpad</a>
+    {{# top_tags }}
+        <a href="../tag/{{ slug }}.html" class="tag-cloud-link" style="font-size: {{ font_size }}pt;" aria-label="{{ tag }} ({{ num_posts }} items)">{{ tag }}</a>
+    {{/ top_tags }}
 </p>