Skip to content

Instantly share code, notes, and snippets.

@lynaghk
Created February 12, 2024 16:16
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save lynaghk/a1346636719b10af2117befcc3bac75c to your computer and use it in GitHub Desktop.
Save lynaghk/a1346636719b10af2117befcc3bac75c to your computer and use it in GitHub Desktop.
(ns newsletter
(:require [hickory.core :as h]
[hickory.select :as s]
[hickory.zip :as hzip]
hickory.render
[clojure.zip :as zip]
[lonocloud.synthread :as ->]))
(defn copy-to-clipboard!
[s]
(-> (java.awt.Toolkit/getDefaultToolkit)
.getSystemClipboard
(.setContents (java.awt.datatransfer.StringSelection. s) nil)))
(defn get-latest-newsletter-file
[]
(->> (file-seq (java.io.File. "../output/newsletter/"))
(filter #(.contains (.getPath %) "2"))
(filter #(.endsWith (.getName %) ".html"))
sort
last))
(defn relative-url?
[s]
(and (not (.startsWith s "//"))
(or (.startsWith s "..")
(.startsWith s "/"))))
(defn make-relative-links-absolute
[$node prefix]
(loop [$node $node]
(if-let [$a (s/select-next-loc (s/tag "a") $node)]
(recur (-> $a
(zip/edit (fn [$a]
(let [href (-> $a :attrs :href)]
(when (.startsWith href "..")
(throw (Error. "relative links not supported!")))
(-> $a
(->/when (relative-url? href)
(assoc-in [:attrs :href] (str prefix href)))))))
zip/next))
$node)))
(defn main [_]
(def f-latest
(get-latest-newsletter-file))
(def $html
(-> (slurp f-latest)
h/parse
h/as-hickory))
(-> (s/select (s/class "newsletter") $html)
first
hzip/hickory-zip
(make-relative-links-absolute "https://kevinlynagh.com")
zip/root
hickory.render/hickory-to-html
copy-to-clipboard!)
(println (format "Newsletter %s copied to clipboard successfully"
(.getName (.getParentFile f-latest)))))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment