Compare commits
No commits in common. "site" and "main" have entirely different histories.
3
.github/FUNDING.yml
vendored
Normal file
3
.github/FUNDING.yml
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
# These are supported funding model platforms
|
||||||
|
|
||||||
|
buy_me_a_coffee: zhgchgli
|
32
.github/workflows/build.yml
vendored
Normal file
32
.github/workflows/build.yml
vendored
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
name: 'Automatic build'
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
paths-ignore:
|
||||||
|
- .gitignore
|
||||||
|
- README.md
|
||||||
|
- LICENSE
|
||||||
|
workflow_dispatch:
|
||||||
|
schedule:
|
||||||
|
- cron: '0 0 * * *' # Runs daily at midnight (00:00 UTC)
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
continuous-delivery:
|
||||||
|
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Setup Ruby
|
||||||
|
uses: ruby/setup-ruby@v1
|
||||||
|
with:
|
||||||
|
ruby-version: 3.4.2
|
||||||
|
bundler-cache: true
|
||||||
|
|
||||||
|
- name: Deploy
|
||||||
|
run: bash deploy.sh
|
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
_output
|
||||||
|
!/_output/AUTO_GEN_FOLDER_DO_NOT_EDIT_FILE_HERE
|
||||||
|
.DS_Store
|
1
.ruby-version
Normal file
1
.ruby-version
Normal file
@ -0,0 +1 @@
|
|||||||
|
3.4.2
|
7
Gemfile
Normal file
7
Gemfile
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
source 'https://rubygems.org'
|
||||||
|
|
||||||
|
gem 'bigdecimal'
|
||||||
|
gem 'base64'
|
||||||
|
gem 'yaml', '~> 0.3'
|
||||||
|
gem 'liquid', '~> 5.5'
|
||||||
|
gem 'nokogiri', '>= 1.18.4'
|
25
Gemfile.lock
Normal file
25
Gemfile.lock
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
GEM
|
||||||
|
remote: https://rubygems.org/
|
||||||
|
specs:
|
||||||
|
base64 (0.2.0)
|
||||||
|
bigdecimal (3.1.9)
|
||||||
|
liquid (5.5.1)
|
||||||
|
mini_portile2 (2.8.7)
|
||||||
|
nokogiri (1.18.5)
|
||||||
|
mini_portile2 (~> 2.8.2)
|
||||||
|
racc (~> 1.4)
|
||||||
|
racc (1.8.1)
|
||||||
|
yaml (0.3.0)
|
||||||
|
|
||||||
|
PLATFORMS
|
||||||
|
ruby
|
||||||
|
|
||||||
|
DEPENDENCIES
|
||||||
|
base64
|
||||||
|
bigdecimal
|
||||||
|
liquid (~> 5.5)
|
||||||
|
nokogiri (>= 1.18.4)
|
||||||
|
yaml (~> 0.3)
|
||||||
|
|
||||||
|
BUNDLED WITH
|
||||||
|
2.6.6
|
21
LICENSE
Normal file
21
LICENSE
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2024 ZhgChgLi
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
3
README.md
Normal file
3
README.md
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
# Elizabeth's Link Page
|
||||||
|
|
||||||
|
Built with [Linkyee](https://github.com/ZhgCH/Linkyee)
|
1
_output/AUTO_GEN_FOLDER_DO_NOT_EDIT_FILE_HERE
Normal file
1
_output/AUTO_GEN_FOLDER_DO_NOT_EDIT_FILE_HERE
Normal file
@ -0,0 +1 @@
|
|||||||
|
The files in this folder (./_output) are auto-generated. Do not edit any files here.
|
86
config.yml
Normal file
86
config.yml
Normal file
@ -0,0 +1,86 @@
|
|||||||
|
# Site Config
|
||||||
|
|
||||||
|
theme: default
|
||||||
|
lang: "en"
|
||||||
|
|
||||||
|
title: "Elizabeth Cray"
|
||||||
|
|
||||||
|
avatar: "./images/profile.jpeg"
|
||||||
|
|
||||||
|
name: "Elizabeth Cray"
|
||||||
|
|
||||||
|
tagline: "Full-stack developer by day, analog photographer by night."
|
||||||
|
|
||||||
|
links:
|
||||||
|
- link:
|
||||||
|
icon: "fa-solid fa-person"
|
||||||
|
text: "Pronouns Page"
|
||||||
|
url: "https://en.pronouns.page/@hackerLiz"
|
||||||
|
alt: "Elizabeth's pronoun and details page"
|
||||||
|
title: "Elizabeth's Pronouns Profile"
|
||||||
|
target: "_blank"
|
||||||
|
- link:
|
||||||
|
icon: "fa-brands fa-bluesky"
|
||||||
|
text: "Bluesky"
|
||||||
|
url: "https://bsky.app/profile/cray.gay"
|
||||||
|
alt: "Elizabeth's Bluesky profile"
|
||||||
|
title: "Bluesky Profile"
|
||||||
|
target: "_blank"
|
||||||
|
- link:
|
||||||
|
icon: "fa-brands fa-linkedin"
|
||||||
|
text: "Linkedin"
|
||||||
|
url: "https://linkedin.com/in/lizcray"
|
||||||
|
alt: "Elizabeth's Linkedin"
|
||||||
|
title: "Elizabeth's Linkedin"
|
||||||
|
target: "_blank"
|
||||||
|
- link:
|
||||||
|
icon: "fa-brands fa-mastodon"
|
||||||
|
text: "Mastodon"
|
||||||
|
url: "https://masto.hackers.town/@liz"
|
||||||
|
alt: "Elizabeth's Hackers Town Mastodon Profile"
|
||||||
|
title: "Elizabeth's Mastodon"
|
||||||
|
target: "_blank"
|
||||||
|
- link:
|
||||||
|
icon: "fa-brands fa-discord"
|
||||||
|
text: "Discord"
|
||||||
|
url: "https://discord.com/channels/@me/172886870110371849"
|
||||||
|
alt: "Elizabeth's Discord Account"
|
||||||
|
title: "Elizabeth's Discord"
|
||||||
|
target: "_blank"
|
||||||
|
- link:
|
||||||
|
icon: "fa-brands fa-git-alt"
|
||||||
|
text: "Git"
|
||||||
|
url: "https://git.corrupt.link/liz"
|
||||||
|
alt: "Elizabeth's Gitea Page"
|
||||||
|
title: "Elizabeth's Gitea"
|
||||||
|
target: "_blank"
|
||||||
|
- link:
|
||||||
|
icon: "fa-solid fa-shuttle-space"
|
||||||
|
text: "Gemini Blog"
|
||||||
|
url: "gemini://gemini.hackers.town/liz/"
|
||||||
|
alt: "Elizabeth's Gemini Blog"
|
||||||
|
title: "Elizabeth's Gemini Blog"
|
||||||
|
target: "_blank"
|
||||||
|
- link:
|
||||||
|
icon: "fa-solid fa-envelope"
|
||||||
|
text: "Email"
|
||||||
|
url: "mailto:liz@corrupt.link"
|
||||||
|
alt: "Elizabeth's email"
|
||||||
|
title: "Elizabeth's email"
|
||||||
|
target: ""
|
||||||
|
- link:
|
||||||
|
icon: "fa-solid fa-briefcase"
|
||||||
|
text: "Resume"
|
||||||
|
url: "https://corrupt.link/pub/Resume.pdf"
|
||||||
|
alt: "Elizabeth's Resume PDF"
|
||||||
|
title: "Elizabeth's Resume"
|
||||||
|
target: "_blank"
|
||||||
|
|
||||||
|
# Todo: Image Gallery
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
footer: ""
|
||||||
|
|
||||||
|
copyright: >
|
||||||
|
©2025 Elizabeth Cray. Powered by <a href="https://github.com/ZhgChgLi/linkyee" target="_blank">linkyee</a>
|
150
default.config.yml
Normal file
150
default.config.yml
Normal file
@ -0,0 +1,150 @@
|
|||||||
|
# Site Configuration
|
||||||
|
|
||||||
|
# Theme, mapped to the directory: ./theme/xxxx
|
||||||
|
theme: default
|
||||||
|
|
||||||
|
# HTML Language setting
|
||||||
|
lang: "en"
|
||||||
|
|
||||||
|
# Plugins, implemented in ./plugins/PLUGIN_NAME
|
||||||
|
# Use {{ vars.PLUGIN_NAME }} in the settings below
|
||||||
|
|
||||||
|
# The output of the plugin can be used below, e.g., {{vars.MediumFollowersCountPlugin}}
|
||||||
|
plugins:
|
||||||
|
# Automatically fetch Medium follower count
|
||||||
|
- MediumFollowersCountPlugin:
|
||||||
|
username: zhgchgli
|
||||||
|
# Automatically fetch Github repo star count
|
||||||
|
- GithubRepoStarsCountPlugin:
|
||||||
|
- ZhgChgLi/ZMarkupParser
|
||||||
|
- ZhgChgLi/ZReviewTender
|
||||||
|
- ZhgChgLi/ZMediumToMarkdown
|
||||||
|
- ZhgChgLi/linkyee
|
||||||
|
|
||||||
|
# Google Analytics tracking id
|
||||||
|
google_analytics_id:
|
||||||
|
|
||||||
|
# HTML Title
|
||||||
|
title: "ZhgChgLi's Links"
|
||||||
|
|
||||||
|
# Avatar image path
|
||||||
|
avatar: "./images/profile.jpeg"
|
||||||
|
|
||||||
|
# Name section text
|
||||||
|
name: "@zhgchgli"
|
||||||
|
|
||||||
|
# Tagline section text
|
||||||
|
tagline: >-
|
||||||
|
An iOS, web, and automation developer from Taiwan 🇹🇼 who also loves sharing, traveling, and writing.
|
||||||
|
|
||||||
|
# List of links
|
||||||
|
# icon: Use Font Awesome icons (https://fontawesome.com/search?o=r&m=free)
|
||||||
|
# text: The displayed text for the link
|
||||||
|
# title: The url title
|
||||||
|
# url: The URL of the link
|
||||||
|
# alt: Alternative text for accessibility
|
||||||
|
# target: `_blank` opens in a new tab, `_self` opens in the same frame
|
||||||
|
links:
|
||||||
|
- link:
|
||||||
|
icon: "fa-brands fa-medium"
|
||||||
|
text: "Tech Blog <span class='link-button-text'>({{vars.MediumFollowersCountPlugin}} Followers)</span>"
|
||||||
|
url: "https://blog.zhgchg.li"
|
||||||
|
alt: "ZhgChgLi's Tech Blog"
|
||||||
|
title: "ZhgChgLi's Tech Blog"
|
||||||
|
target: "_blank"
|
||||||
|
- link:
|
||||||
|
icon: "fa-brands fa-medium"
|
||||||
|
text: "Travelog <span class='link-button-text'>({{vars.MediumFollowersCountPlugin}} Followers)</span>"
|
||||||
|
url: "https://medium.com/ztravel"
|
||||||
|
alt: "ZhgChgLi's Travelog"
|
||||||
|
title: "ZhgChgLi's Travelog"
|
||||||
|
target: "_blank"
|
||||||
|
- link:
|
||||||
|
icon: "fa-solid fa-rss"
|
||||||
|
text: "Website"
|
||||||
|
url: "https://zhgchg.li/"
|
||||||
|
alt: "ZhgChgLi's Website"
|
||||||
|
title: "ZhgChgLi's Website"
|
||||||
|
target: "_blank"
|
||||||
|
- link:
|
||||||
|
icon: "fa-brands fa-swift"
|
||||||
|
text: "ZMarkupParser <span class='link-button-text'>({{vars.GithubRepoStarsCountPlugin['ZhgChgLi/ZMarkupParser']}} Stars)</span>"
|
||||||
|
url: "https://github.com/ZhgChgLi/ZMarkupParser"
|
||||||
|
alt: "ZMarkupParser is a pure-Swift library that helps you to convert HTML strings to NSAttributedString with customized style and tags."
|
||||||
|
title: "ZMarkupParser is a pure-Swift library that helps you to convert HTML strings to NSAttributedString with customized style and tags."
|
||||||
|
target: "_blank"
|
||||||
|
- link:
|
||||||
|
icon: "fa-brands fa-app-store-ios"
|
||||||
|
text: "ZReviewTender <span class='link-button-text'>({{vars.GithubRepoStarsCountPlugin['ZhgChgLi/ZReviewTender']}} Stars)</span>"
|
||||||
|
url: "https://github.com/ZhgChgLi/ZReviewTender"
|
||||||
|
alt: "ZReviewTender is a tool for fetching app reviews from the App Store and Google Play Console and integrating them into your workflow."
|
||||||
|
title: "ZReviewTender is a tool for fetching app reviews from the App Store and Google Play Console and integrating them into your workflow."
|
||||||
|
target: "_blank"
|
||||||
|
- link:
|
||||||
|
icon: "fa-brands fa-markdown"
|
||||||
|
text: "ZMediumToMarkdown <span class='link-button-text'>({{vars.GithubRepoStarsCountPlugin['ZhgChgLi/ZMediumToMarkdown']}} Stars)</span>"
|
||||||
|
url: "https://github.com/ZhgChgLi/ZMediumToMarkdown"
|
||||||
|
alt: "ZMediumToMarkdown is a powerful tool that allows you to effortlessly download and convert your Medium posts to Markdown format."
|
||||||
|
title: "ZMediumToMarkdown is a powerful tool that allows you to effortlessly download and convert your Medium posts to Markdown format."
|
||||||
|
target: "_blank"
|
||||||
|
- link:
|
||||||
|
icon: "fa-brands fa-github"
|
||||||
|
text: "linkyee <span class='link-button-text'>({{vars.GithubRepoStarsCountPlugin['ZhgChgLi/linkyee']}} Stars)</span>"
|
||||||
|
url: "https://github.com/ZhgChgLi/linkyee"
|
||||||
|
alt: "linkyee is a fully customized, open-source LinkTree alternative deployed directly on GitHub Pages."
|
||||||
|
title: "linkyee is a fully customized, open-source LinkTree alternative deployed directly on GitHub Pages."
|
||||||
|
target: "_blank"
|
||||||
|
|
||||||
|
|
||||||
|
# List of social media links
|
||||||
|
# icon: Use Font Awesome icons (https://fontawesome.com/search?o=r&m=free)
|
||||||
|
# title: The url title
|
||||||
|
# url: The URL of the social media link
|
||||||
|
# alt: Alternative text for accessibility
|
||||||
|
# target: _blank opens in a new tab, _self opens in the same frame
|
||||||
|
socials:
|
||||||
|
- social:
|
||||||
|
icon: "fa-brands fa-medium"
|
||||||
|
url: "https://blog.zhgchg.li"
|
||||||
|
title: "ZhgChgLi's Medium"
|
||||||
|
alt: "ZhgChgLi's Medium"
|
||||||
|
target: "_blank"
|
||||||
|
- social:
|
||||||
|
icon: "fa-brands fa-github"
|
||||||
|
url: "https://github.com/ZhgChgLi"
|
||||||
|
title: "ZhgChgLi's GitHub"
|
||||||
|
alt: "ZhgChgLi's GitHub"
|
||||||
|
target: "_blank"
|
||||||
|
- social:
|
||||||
|
icon: "fa-brands fa-twitter"
|
||||||
|
url: "https://twitter.com/zhgchgli"
|
||||||
|
title: "ZhgChgLi's Twitter"
|
||||||
|
alt: "ZhgChgLi's Twitter"
|
||||||
|
target: "_blank"
|
||||||
|
- social:
|
||||||
|
icon: "fa-brands fa-linkedin"
|
||||||
|
url: "https://www.linkedin.com/in/zhgchgli/"
|
||||||
|
title: "ZhgChgLi's LinkedIn"
|
||||||
|
alt: "ZhgChgLi's LinkedIn"
|
||||||
|
target: "_blank"
|
||||||
|
- social:
|
||||||
|
icon: "fa-brands fa-instagram"
|
||||||
|
url: "https://www.instagram.com/zhgchgli/"
|
||||||
|
title: "Instagram"
|
||||||
|
alt: "ZhgChgLi's Instagram"
|
||||||
|
target: "_blank"
|
||||||
|
- social:
|
||||||
|
icon: "fa-solid fa-envelope"
|
||||||
|
url: "mailto:zhgchgli@gmail.com"
|
||||||
|
title: "Email: zhgchgli@gmail.com"
|
||||||
|
alt: "zhgchgli@gmail.com"
|
||||||
|
target: "_blank"
|
||||||
|
|
||||||
|
# Footer text
|
||||||
|
footer: >
|
||||||
|
Hi there! Follow me on Medium or GitHub, or stay connected on Instagram or LinkedIn.
|
||||||
|
|
||||||
|
# Footer copyright message
|
||||||
|
# Linkyee is a 100% free, open-source project—feel free to modify the copyright message as you like. :)
|
||||||
|
copyright: >
|
||||||
|
© 2024 <a href="https://zhgchg.li" target="_blank">ZhgChgLi</a>. Powered by <a href="https://github.com/ZhgChgLi/linkyee" target="_blank">linkyee</a>
|
83
deploy.sh
Executable file
83
deploy.sh
Executable file
@ -0,0 +1,83 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# ref: https://github.com/jekyll/jekyll
|
||||||
|
|
||||||
|
set -eu # Exit on error or unset variable
|
||||||
|
|
||||||
|
PAGES_BRANCH="site"
|
||||||
|
|
||||||
|
SITE_DIR="_output"
|
||||||
|
|
||||||
|
_backup_dir="$(mktemp -d)"
|
||||||
|
|
||||||
|
DATE_STAMP=$(date +"%Y-%m-%d %H:%M:%S")
|
||||||
|
|
||||||
|
init() {
|
||||||
|
echo "Initializing..."
|
||||||
|
}
|
||||||
|
|
||||||
|
build() {
|
||||||
|
# clean
|
||||||
|
if [[ -d $SITE_DIR ]]; then
|
||||||
|
rm -rf "$SITE_DIR"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Run the Ruby script to generate the output
|
||||||
|
bundle exec ruby "./scaffold.rb"
|
||||||
|
}
|
||||||
|
|
||||||
|
setup_gh() {
|
||||||
|
if [[ -z $(git branch -av | grep "$PAGES_BRANCH") ]]; then
|
||||||
|
git checkout -b "$PAGES_BRANCH"
|
||||||
|
else
|
||||||
|
git checkout "$PAGES_BRANCH"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
backup() {
|
||||||
|
mv "$SITE_DIR"/* "$_backup_dir"
|
||||||
|
mv .git "$_backup_dir"
|
||||||
|
|
||||||
|
if [[ -f CNAME ]]; then
|
||||||
|
mv CNAME "$_backup_dir"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
flush() {
|
||||||
|
rm -rf ./*
|
||||||
|
rm -rf .[^.] .??*
|
||||||
|
|
||||||
|
shopt -s dotglob nullglob
|
||||||
|
|
||||||
|
mv "$_backup_dir"/* .
|
||||||
|
}
|
||||||
|
|
||||||
|
deploy() {
|
||||||
|
# Configure Git user for the commit
|
||||||
|
git config --global user.name "Elizabeth Cray"
|
||||||
|
git config --global user.email "liz@cray.lgbt"
|
||||||
|
|
||||||
|
# Reset the current HEAD to prepare for new commits
|
||||||
|
git update-ref -d HEAD
|
||||||
|
git add -A
|
||||||
|
git commit -m "[Automation] Site update: ${DATE_STAMP}"
|
||||||
|
|
||||||
|
# Push the new branch to the remote repository
|
||||||
|
git push -u origin "$PAGES_BRANCH" --force
|
||||||
|
}
|
||||||
|
|
||||||
|
reset() {
|
||||||
|
git checkout main
|
||||||
|
}
|
||||||
|
|
||||||
|
main() {
|
||||||
|
init
|
||||||
|
build
|
||||||
|
setup_gh
|
||||||
|
backup
|
||||||
|
flush
|
||||||
|
deploy
|
||||||
|
reset
|
||||||
|
}
|
||||||
|
|
||||||
|
# Execute the main function
|
||||||
|
main
|
119
index.html
119
index.html
@ -1,119 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<meta charset="UTF-8" />
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
||||||
<title>Elizabeth Cray</title>
|
|
||||||
|
|
||||||
<meta charset="UTF-8">
|
|
||||||
<meta name="last-modified" content="2025-04-22T21:08:38-0400">
|
|
||||||
<meta name="theme-color" media="(prefers-color-scheme: light)" content="#f7f7f7">
|
|
||||||
<meta name="theme-color" media="(prefers-color-scheme: dark)" content="#1b1b1e">
|
|
||||||
<meta name="apple-mobile-web-app-capable" content="yes">
|
|
||||||
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
|
|
||||||
<meta
|
|
||||||
name="viewport"
|
|
||||||
content="width=device-width, user-scalable=no initial-scale=1, shrink-to-fit=no, viewport-fit=cover"
|
|
||||||
>
|
|
||||||
|
|
||||||
<meta property="og:title" content="Elizabeth Cray" />
|
|
||||||
<meta name="author" content="Elizabeth Cray" />
|
|
||||||
<meta property="og:locale" content="en" />
|
|
||||||
<meta name="description" content="Full-stack developer by day, analog photographer by night." />
|
|
||||||
<meta property="og:description" content="Full-stack developer by day, analog photographer by night." />
|
|
||||||
<meta property="og:site_name" content="Elizabeth Cray" />
|
|
||||||
<meta property="og:image" content="./images/profile.jpeg" />
|
|
||||||
<meta property="og:type" content="article" />
|
|
||||||
<meta name="twitter:card" content="summary_large_image" />
|
|
||||||
<meta property="twitter:image" content="./images/profile.jpeg" />
|
|
||||||
<meta property="twitter:title" content="Elizabeth Cray" />
|
|
||||||
|
|
||||||
<link rel="apple-touch-icon" sizes="180x180" href="./images/favicons/apple-touch-icon.png">
|
|
||||||
<link rel="icon" type="image/png" sizes="32x32" href="./images/favicons/favicon-32x32.png">
|
|
||||||
<link rel="icon" type="image/png" sizes="16x16" href="./images/favicons/favicon-16x16.png">
|
|
||||||
<link rel="manifest" href="./images/favicons/site.webmanifest">
|
|
||||||
<link rel="shortcut icon" href="./images/favicons/favicon.ico">
|
|
||||||
<meta name="apple-mobile-web-app-title" content="Elizabeth Cray">
|
|
||||||
<meta name="application-name" content="Elizabeth Cray">
|
|
||||||
<meta name="msapplication-TileColor" content="#da532c">
|
|
||||||
<meta name="msapplication-config" content="./images/favicons/browserconfig.xml">
|
|
||||||
<meta name="theme-color" content="#ffffff">
|
|
||||||
|
|
||||||
|
|
||||||
<link rel="stylesheet" href="./styles.css" />
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<div class="container">
|
|
||||||
<div class="profile">
|
|
||||||
<img src="./images/profile.jpeg" alt="Profile Picture" class="profile-pic" />
|
|
||||||
<h1 class="name">Elizabeth Cray</h1>
|
|
||||||
<p class="description">Full-stack developer by day, analog photographer by night.</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="links">
|
|
||||||
|
|
||||||
|
|
||||||
<a href="https://en.pronouns.page/@hackerLiz" target="_blank" class="link-button" alt="Elizabeth's pronoun and details page" title="Elizabeth's Pronouns Profile">
|
|
||||||
<i class="fa-solid fa-person"></i> Pronouns Page
|
|
||||||
</a>
|
|
||||||
|
|
||||||
|
|
||||||
<a href="https://bsky.app/profile/cray.gay" target="_blank" class="link-button" alt="Elizabeth's Bluesky profile" title="Bluesky Profile">
|
|
||||||
<i class="fa-brands fa-bluesky"></i> Bluesky
|
|
||||||
</a>
|
|
||||||
|
|
||||||
|
|
||||||
<a href="https://linkedin.com/in/lizcray" target="_blank" class="link-button" alt="Elizabeth's Linkedin" title="Elizabeth's Linkedin">
|
|
||||||
<i class="fa-brands fa-linkedin"></i> Linkedin
|
|
||||||
</a>
|
|
||||||
|
|
||||||
|
|
||||||
<a href="https://masto.hackers.town/@liz" target="_blank" class="link-button" alt="Elizabeth's Hackers Town Mastodon Profile" title="Elizabeth's Mastodon">
|
|
||||||
<i class="fa-brands fa-mastodon"></i> Mastodon
|
|
||||||
</a>
|
|
||||||
|
|
||||||
|
|
||||||
<a href="https://discord.com/channels/@me/172886870110371849" target="_blank" class="link-button" alt="Elizabeth's Discord Account" title="Elizabeth's Discord">
|
|
||||||
<i class="fa-brands fa-discord"></i> Discord
|
|
||||||
</a>
|
|
||||||
|
|
||||||
|
|
||||||
<a href="https://git.corrupt.link/liz" target="_blank" class="link-button" alt="Elizabeth's Gitea Page" title="Elizabeth's Gitea">
|
|
||||||
<i class="fa-brands fa-git-alt"></i> Git
|
|
||||||
</a>
|
|
||||||
|
|
||||||
|
|
||||||
<a href="gemini://gemini.hackers.town/liz/" target="_blank" class="link-button" alt="Elizabeth's Gemini Blog" title="Elizabeth's Gemini Blog">
|
|
||||||
<i class="fa-solid fa-shuttle-space"></i> Gemini Blog
|
|
||||||
</a>
|
|
||||||
|
|
||||||
|
|
||||||
<a href="mailto:liz@corrupt.link" target="" class="link-button" alt="Elizabeth's email" title="Elizabeth's email">
|
|
||||||
<i class="fa-solid fa-envelope"></i> Email
|
|
||||||
</a>
|
|
||||||
|
|
||||||
|
|
||||||
<a href="https://corrupt.link/pub/Resume.pdf" target="_blank" class="link-button" alt="Elizabeth's Resume PDF" title="Elizabeth's Resume">
|
|
||||||
<i class="fa-solid fa-briefcase"></i> Resume
|
|
||||||
</a>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="button-container">
|
|
||||||
<div class="button-group">
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<footer class="footer">
|
|
||||||
|
|
||||||
<div class="copyright">©2025 Elizabeth Cray. Powered by <a href="https://github.com/ZhgChgLi/linkyee" target="_blank">linkyee</a>
|
|
||||||
</div>
|
|
||||||
</footer>
|
|
||||||
</div>
|
|
||||||
<script src="fontawesome/js/all.js" data-auto-replace-svg="nest"></script>
|
|
||||||
<script src="https://livejs.com/live.js"></script>
|
|
||||||
|
|
||||||
<script src="./scripts.js"></script>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
11
plugins/Plugin.rb
Normal file
11
plugins/Plugin.rb
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
class Plugin
|
||||||
|
attr_reader :data
|
||||||
|
|
||||||
|
def initialize(data)
|
||||||
|
@data = data
|
||||||
|
end
|
||||||
|
|
||||||
|
def execute
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
98
scaffold.rb
Normal file
98
scaffold.rb
Normal file
@ -0,0 +1,98 @@
|
|||||||
|
require 'fileutils'
|
||||||
|
require 'liquid'
|
||||||
|
require 'yaml'
|
||||||
|
|
||||||
|
if File.exist?("config.yml")
|
||||||
|
config = YAML.load_file("config.yml")
|
||||||
|
else
|
||||||
|
raise "Error: config.yml not found."
|
||||||
|
end
|
||||||
|
|
||||||
|
settings = YAML.load_file("config.yml") || {}
|
||||||
|
|
||||||
|
#
|
||||||
|
source_dir = "./themes/#{settings["theme"] || "default"}"
|
||||||
|
destination_dir = "./_output/"
|
||||||
|
|
||||||
|
# Clean _output folder
|
||||||
|
if Dir.exist?(destination_dir)
|
||||||
|
Dir.foreach(destination_dir) do |file|
|
||||||
|
next if file == '.' || file == '..' || file == 'AUTO_GEN_FOLDER_DO_NOT_EDIT_FILE_HERE'
|
||||||
|
file_path = File.join(destination_dir, file)
|
||||||
|
|
||||||
|
if File.file?(file_path)
|
||||||
|
FileUtils.rm(file_path)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else
|
||||||
|
FileUtils.mkdir_p(destination_dir)
|
||||||
|
end
|
||||||
|
|
||||||
|
# Copy all files and directories while preserving the structure
|
||||||
|
Dir.glob("#{source_dir}/**/*").each do |entry|
|
||||||
|
relative_path = entry.sub("#{source_dir}/", '')
|
||||||
|
|
||||||
|
new_location = File.join(destination_dir, relative_path)
|
||||||
|
|
||||||
|
if File.directory?(entry)
|
||||||
|
FileUtils.mkdir_p(new_location)
|
||||||
|
else
|
||||||
|
FileUtils.cp(entry, new_location)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
template_file = "#{destination_dir}/index.html"
|
||||||
|
if !File.exist?(template_file)
|
||||||
|
raise "Error: #{template_file} file not found."
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
template_content = File.read(template_file)
|
||||||
|
|
||||||
|
settings["vars"] = {}
|
||||||
|
if !settings["plugins"].nil?
|
||||||
|
settings["plugins"].each do |plugin|
|
||||||
|
pluginFileName = plugin.keys[0]
|
||||||
|
if File.exist?("./plugins/#{pluginFileName}.rb")
|
||||||
|
require_relative "./plugins/#{pluginFileName}.rb"
|
||||||
|
pluginObject = Object.const_get(pluginFileName).new(plugin.values)
|
||||||
|
settings["vars"][pluginFileName] = pluginObject.execute()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
if !settings["links"].nil?
|
||||||
|
settings["links"].each_with_index do |link, index|
|
||||||
|
settings["links"][index]["link"]["icon"] = Liquid::Template.parse(settings["links"][index]["link"]["icon"]).render(settings)
|
||||||
|
settings["links"][index]["link"]["url"] = Liquid::Template.parse(settings["links"][index]["link"]["url"]).render(settings)
|
||||||
|
settings["links"][index]["link"]["alt"] = Liquid::Template.parse(settings["links"][index]["link"]["alt"]).render(settings)
|
||||||
|
settings["links"][index]["link"]["title"] = Liquid::Template.parse(settings["links"][index]["link"]["title"]).render(settings)
|
||||||
|
settings["links"][index]["link"]["text"] = Liquid::Template.parse(settings["links"][index]["link"]["text"]).render(settings)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if !settings["socials"].nil?
|
||||||
|
settings["socials"].each_with_index do |link, index|
|
||||||
|
settings["socials"][index]["social"]["icon"] = Liquid::Template.parse(settings["socials"][index]["social"]["icon"]).render(settings)
|
||||||
|
settings["socials"][index]["social"]["url"] = Liquid::Template.parse(settings["socials"][index]["social"]["url"]).render(settings)
|
||||||
|
settings["socials"][index]["social"]["alt"] = Liquid::Template.parse(settings["socials"][index]["social"]["alt"]).render(settings)
|
||||||
|
settings["socials"][index]["social"]["title"] = Liquid::Template.parse(settings["socials"][index]["social"]["title"]).render(settings)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
settings["title"] = Liquid::Template.parse(settings["title"]).render(settings)
|
||||||
|
settings["footer"] = Liquid::Template.parse(settings["footer"]).render(settings)
|
||||||
|
settings["tagline"] = Liquid::Template.parse(settings["tagline"]).render(settings)
|
||||||
|
settings["name"] = Liquid::Template.parse(settings["name"]).render(settings)
|
||||||
|
settings["last_modified_at"] = Time.now.strftime("%Y-%m-%dT%H:%M:%S%z")
|
||||||
|
|
||||||
|
# Parse the Liquid template
|
||||||
|
liquid_template = Liquid::Template.parse(template_content)
|
||||||
|
|
||||||
|
rendered_content = liquid_template.render(settings)
|
||||||
|
|
||||||
|
File.open(template_file, 'w') do |file|
|
||||||
|
file.write(rendered_content)
|
||||||
|
end
|
BIN
themes/.DS_Store
vendored
Normal file
BIN
themes/.DS_Store
vendored
Normal file
Binary file not shown.
BIN
themes/default/.DS_Store
vendored
Normal file
BIN
themes/default/.DS_Store
vendored
Normal file
Binary file not shown.
BIN
themes/default/fontawesome/.DS_Store
vendored
Normal file
BIN
themes/default/fontawesome/.DS_Store
vendored
Normal file
Binary file not shown.
Before Width: | Height: | Size: 496 KiB After Width: | Height: | Size: 496 KiB |
Before Width: | Height: | Size: 115 KiB After Width: | Height: | Size: 115 KiB |
Before Width: | Height: | Size: 870 KiB After Width: | Height: | Size: 870 KiB |
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user