nani.wtf/static-site-generator/Preprocessing/LogoLinks.hs

120 lines
4.0 KiB
Haskell

{-# LANGUAGE QuasiQuotes, FlexibleContexts #-}
module Preprocessing.LogoLinks where
import Hakyll
import Text.Regex.PCRE.Heavy (Regex, re, gsub)
import Debug.Trace
type Html = String
type LLConverter = String -> String -> Html
replaceLogoLinks :: Item String -> Compiler (Item String)
replaceLogoLinks = return . fmap replaceAllLogoLinks
fullLogoLinkRegex :: Regex
fullLogoLinkRegex = [re|\[(.*?)\|(.*?)\]\((.*?)\)|]
shortLogoLinkRegex :: Regex
shortLogoLinkRegex = [re|\[(.*?)\|(.*?)\](?!\()|]
replaceAllLogoLinks :: Html -> Html
replaceAllLogoLinks = gsub fullLogoLinkRegex f . gsub shortLogoLinkRegex g
where
g (key:s1:_)
| key == "gh" = github s1 ("https://github.com/" ++ s1)
| key == "gl" = gitlab s1 ("https://gitlab.com/" ++ s1)
| key == "ga" = gitea s1 ("https://gitea.com/" ++ s1)
| key == "nani" = nani s1 ("https://git.nani.wtf/" ++ s1)
| key == "pub" = pub s1 ("https://pub.dev/packages/" ++ s1)
| key == "nxp" = nixpackages s1 ("https://search.nixos.org/packages?query=" ++ s1)
| key == "nxo" = nixoptions s1 ("https://search.nixos.org/options?query=" ++ s1)
| key == "npm" = npm s1 ("https://www.npmjs.com/package/" ++ s1)
| key == "crt" = crates s1 ("https://crates.io/crates/" ++ s1)
| key == "hk" = hackage s1 ("https://hackage.haskell.org/package/" ++ s1)
| key == "hg" = hoogle s1 ("https://hoogle.haskell.org/?hoogle=" ++ s1)
| key == "yt" = youtube s1 ("https://www.youtube.com/embed/" ++ s1)
-- Reconstruct the original text
| otherwise = foldr1 (++) ["[", key, "|", s1, "]"]
f (key:s1:s2:_)
| key == "kan" = kan s1 s2
| key == "so" = stackoverflow s1 s2
| key == "rd" = reddit s1 s2
| key == "wiki" = wikipedia s1 s2
| key == "jisho" = jisho s1 s2
-- Reconstruct the original text
| otherwise = foldr1 (++) ["[", key, "|", s1, "](", s2, ")"]
{- This should be removed once all icons are added, and all functions are implemented -}
generateGenericLink :: String -> LLConverter
generateGenericLink linkTitle = f
where
f name link = foldr1 (++) ["<a href=\"", link, "\">", linkTitle, ": ", name, "</a>"]
badgeLinkWithCustomClasses :: String -> [String] -> LLConverter
badgeLinkWithCustomClasses imageName classes = f
where
f name link = foldr1 (++) [
"<span class='bg-dark rounded-3 my-1 px-2 py-1 position-relative nani_logo-link " ++ unwords classes ++ "'>",
"<img src='/images/logos/" ++ imageName ++ "' class='card-img-left me-2' alt='GitHub Logo'>",
"<span class='text-light'>" ++ name ++ "</span>",
"<a href='" ++ link ++ "' class='stretched-link'></a>",
"</span>"
]
badgeLink :: String -> LLConverter
badgeLink imageName = badgeLinkWithCustomClasses imageName []
kan :: LLConverter
kan kanji kana = foldr1 (++) ["<ruby><rb>", kanji, "</rb> <rp>(</rp><rt>", kana, "</rt><rp>)</rp></ruby>"]
github :: LLConverter
github = badgeLink "github.svg"
gitlab :: LLConverter
gitlab = badgeLink "gitlab.svg"
gitea :: LLConverter
gitea = badgeLink "gitea.svg"
nani :: LLConverter
nani = badgeLink "nani.svg"
stackoverflow :: LLConverter
stackoverflow = badgeLink "stack_overflow.svg"
pub :: LLConverter
pub = badgeLink "dart.svg"
hoogle :: LLConverter
hoogle = badgeLink "haskell_orange.svg"
crates :: LLConverter
crates = badgeLinkWithCustomClasses "rust.svg" ["nani_logo-link-color-inverted"]
hackage :: LLConverter
hackage = badgeLink "haskell_purple.svg"
nixpackages :: LLConverter
nixpackages = badgeLink "nix_packages.svg"
nixoptions :: LLConverter
nixoptions = badgeLink "nix_options.svg"
npm :: LLConverter
npm = badgeLink "npm.svg"
reddit :: LLConverter
reddit = badgeLink "reddit.svg"
wikipedia :: LLConverter
wikipedia = badgeLinkWithCustomClasses "wikipedia.svg" ["nani_logo-link-color-inverted"]
youtube :: LLConverter
youtube _ link = "<div class='nani_youtube'><iframe src='" ++ link ++ "' frameborder='0' allowfullscreen></iframe></div>"
jisho :: LLConverter
jisho name link = undefined