paritybit.ca

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

commit fc5fee5ba3544966a8d1c93adae2dbc0b912bc6a
parent 5fc6e5885b7004fe1031ebfa992f181e44f3565d
Author: Jake Bauer <jbauer@paritybit.ca>
Date:   Sun, 27 Sep 2020 12:50:09 -0400

Separate HTTP and Gemini stuff

Diffstat:
M.gitignore | 18+++++++++---------
Dbuild/header.html | 38--------------------------------------
Rbuild/footer.html -> http/build/footer.html | 0
Rbuild/logos/logo-ftp.svg -> http/build/logos/logo-ftp.svg | 0
Rbuild/logos/logo-git.svg -> http/build/logos/logo-git.svg | 0
Rbuild/logos/logo-main.svg -> http/build/logos/logo-main.svg | 0
Rbuild/logos/logo-mastodon.svg -> http/build/logos/logo-mastodon.svg | 0
Rbuild/logos/logo-status-uptimerobot.svg -> http/build/logos/logo-status-uptimerobot.svg | 0
Rbuild/logos/logo-status.svg -> http/build/logos/logo-status.svg | 0
Rbuild/logos/logo-wiki.svg -> http/build/logos/logo-wiki.svg | 0
Rbuild/logos/logo.svg -> http/build/logos/logo.svg | 0
Rcompile -> http/compile | 0
Rgenerate-blogroll.sh -> http/generate-blogroll.sh | 0
Rpages/404.md -> http/pages/404.md | 0
Rpages/about-site.md -> http/pages/about-site.md | 0
Rpages/about.md -> http/pages/about.md | 0
Rpages/blog.md -> http/pages/blog.md | 0
Rpages/blog/a-brief-review-of-fedora-32.md -> http/pages/blog/a-brief-review-of-fedora-32.md | 0
Rpages/blog/a-month-and-a-half-of-self-hosted-email.md -> http/pages/blog/a-month-and-a-half-of-self-hosted-email.md | 0
Rpages/blog/a-quick-rant-about-web-font-sizes.md -> http/pages/blog/a-quick-rant-about-web-font-sizes.md | 0
Rpages/blog/adding-image-optimization-to-my-static-site-generator.md -> http/pages/blog/adding-image-optimization-to-my-static-site-generator.md | 0
Rpages/blog/adding-search-to-my-blog.md -> http/pages/blog/adding-search-to-my-blog.md | 0
Rpages/blog/announcing-kontaktb.md -> http/pages/blog/announcing-kontaktb.md | 0
Rpages/blog/are-todo-applications-a-waste-of-time.md -> http/pages/blog/are-todo-applications-a-waste-of-time.md | 0
Rpages/blog/arguing-effectively.md -> http/pages/blog/arguing-effectively.md | 0
Rpages/blog/attempting-to-replace-my-thinkpads-touchpad.md -> http/pages/blog/attempting-to-replace-my-thinkpads-touchpad.md | 0
Rpages/blog/automating-publishing.md -> http/pages/blog/automating-publishing.md | 0
Rpages/blog/be-a-good-netizen.md -> http/pages/blog/be-a-good-netizen.md | 0
Rpages/blog/book-review-the-mediocre-programmer.md -> http/pages/blog/book-review-the-mediocre-programmer.md | 0
Rpages/blog/btw-i-use-arch.md -> http/pages/blog/btw-i-use-arch.md | 0
Rpages/blog/caring-about-seo.md -> http/pages/blog/caring-about-seo.md | 0
Rpages/blog/cat-v-considered-harmful.md -> http/pages/blog/cat-v-considered-harmful.md | 0
Rpages/blog/china.md -> http/pages/blog/china.md | 0
Rpages/blog/choosing-a-self-hosted-git-service.md -> http/pages/blog/choosing-a-self-hosted-git-service.md | 0
Rpages/blog/choosing-an-investment-brokerage.md -> http/pages/blog/choosing-an-investment-brokerage.md | 0
Rpages/blog/clone-wars-finale.md -> http/pages/blog/clone-wars-finale.md | 0
Rpages/blog/colours-for-gitea-issues.md -> http/pages/blog/colours-for-gitea-issues.md | 0
Rpages/blog/curating-my-blogroll.md -> http/pages/blog/curating-my-blogroll.md | 0
Rpages/blog/debian-with-btrfs.md -> http/pages/blog/debian-with-btrfs.md | 0
Rpages/blog/decommissioning-my-rackmount-server.md -> http/pages/blog/decommissioning-my-rackmount-server.md | 0
Rpages/blog/difficulty-of-privacy-education.md -> http/pages/blog/difficulty-of-privacy-education.md | 0
Rpages/blog/diving-deeper-into-the-small-internet.md -> http/pages/blog/diving-deeper-into-the-small-internet.md | 0
Rpages/blog/dnd-xp-system.md -> http/pages/blog/dnd-xp-system.md | 0
Rpages/blog/ethical-investing.md -> http/pages/blog/ethical-investing.md | 0
Rpages/blog/generating-my-geek-code.md -> http/pages/blog/generating-my-geek-code.md | 0
Rpages/blog/gentoo-isnt-for-me.md -> http/pages/blog/gentoo-isnt-for-me.md | 0
Rpages/blog/going-from-user-to-contributor-with-foss.md -> http/pages/blog/going-from-user-to-contributor-with-foss.md | 0
Rpages/blog/gomux-is-the-best-cli-matrix-client.md -> http/pages/blog/gomux-is-the-best-cli-matrix-client.md | 0
Rpages/blog/housecleaning.md -> http/pages/blog/housecleaning.md | 0
Rpages/blog/how-far-translation-tools-have-come.md -> http/pages/blog/how-far-translation-tools-have-come.md | 0
Rpages/blog/how-i-keep-my-home-directory-clean.md -> http/pages/blog/how-i-keep-my-home-directory-clean.md | 0
Rpages/blog/how-i-manage-my-dotfiles.md -> http/pages/blog/how-i-manage-my-dotfiles.md | 0
Rpages/blog/how-much-ram-is-enough.md -> http/pages/blog/how-much-ram-is-enough.md | 0
Rpages/blog/how-to-create-an-rss-feed-for-your-blog-1.md -> http/pages/blog/how-to-create-an-rss-feed-for-your-blog-1.md | 0
Rpages/blog/how-to-create-an-rss-feed-for-your-blog-2.md -> http/pages/blog/how-to-create-an-rss-feed-for-your-blog-2.md | 0
Rpages/blog/how-to-create-an-rss-feed-for-your-blog-3.md -> http/pages/blog/how-to-create-an-rss-feed-for-your-blog-3.md | 0
Rpages/blog/how-to-not-make-an-ass-of-yourself-internet-discussions.md -> http/pages/blog/how-to-not-make-an-ass-of-yourself-internet-discussions.md | 0
Rpages/blog/i-got-more-ram.md -> http/pages/blog/i-got-more-ram.md | 0
Rpages/blog/i-like-perl.md -> http/pages/blog/i-like-perl.md | 0
Rpages/blog/i-was-wrong.md -> http/pages/blog/i-was-wrong.md | 0
Rpages/blog/improving-blog-searching.md -> http/pages/blog/improving-blog-searching.md | 0
Rpages/blog/improving-my-blog-post-publishing-script.md -> http/pages/blog/improving-my-blog-post-publishing-script.md | 0
Rpages/blog/interesting-things-for-today.md -> http/pages/blog/interesting-things-for-today.md | 0
Rpages/blog/it-doesnt-have-to-be-perfect.md -> http/pages/blog/it-doesnt-have-to-be-perfect.md | 0
Rpages/blog/logo-redesign.md -> http/pages/blog/logo-redesign.md | 0
Rpages/blog/machine-hostnames.md -> http/pages/blog/machine-hostnames.md | 0
Rpages/blog/making-my-own-vim-statusline.md -> http/pages/blog/making-my-own-vim-statusline.md | 0
Rpages/blog/making-my-site-easier-to-read.md -> http/pages/blog/making-my-site-easier-to-read.md | 0
Rpages/blog/mastodon-to-pleroma-1-setting-up-a-pleroma-server.md -> http/pages/blog/mastodon-to-pleroma-1-setting-up-a-pleroma-server.md | 0
Rpages/blog/mastodon-to-pleroma-2-customizing-my-instance.md -> http/pages/blog/mastodon-to-pleroma-2-customizing-my-instance.md | 0
Rpages/blog/mastodon-to-pleroma-3-shutting-down-mastodon.md -> http/pages/blog/mastodon-to-pleroma-3-shutting-down-mastodon.md | 0
Rpages/blog/migrating-my-wiki-off-of-mediawiki.md -> http/pages/blog/migrating-my-wiki-off-of-mediawiki.md | 0
Rpages/blog/my-attempts-to-fix-my-mastodon-instance.md -> http/pages/blog/my-attempts-to-fix-my-mastodon-instance.md | 0
Rpages/blog/my-beginnings-with-gentoo.md -> http/pages/blog/my-beginnings-with-gentoo.md | 0
Rpages/blog/my-first-ctf.md -> http/pages/blog/my-first-ctf.md | 0
Rpages/blog/my-git-server-was-ddosed.md -> http/pages/blog/my-git-server-was-ddosed.md | 0
Rpages/blog/my-journey-with-computers.md -> http/pages/blog/my-journey-with-computers.md | 0
Rpages/blog/my-lwn-theme.md -> http/pages/blog/my-lwn-theme.md | 0
Rpages/blog/my-new-t420s.md -> http/pages/blog/my-new-t420s.md | 0
Rpages/blog/my-preferred-fediverse-mobile-client.md -> http/pages/blog/my-preferred-fediverse-mobile-client.md | 0
Rpages/blog/my-todo-solution.md -> http/pages/blog/my-todo-solution.md | 0
Rpages/blog/my-top-10-most-used-commands.md -> http/pages/blog/my-top-10-most-used-commands.md | 0
Rpages/blog/new-desktop-checklist.md -> http/pages/blog/new-desktop-checklist.md | 0
Rpages/blog/new-server-checklist.md -> http/pages/blog/new-server-checklist.md | 0
Rpages/blog/nope-back-to-st.md -> http/pages/blog/nope-back-to-st.md | 0
Rpages/blog/paying-for-software.md -> http/pages/blog/paying-for-software.md | 0
Rpages/blog/posting-statuses-on-pleroma-with-a-shell-script.md -> http/pages/blog/posting-statuses-on-pleroma-with-a-shell-script.md | 0
Rpages/blog/preparing-to-self-host-email.md -> http/pages/blog/preparing-to-self-host-email.md | 0
Rpages/blog/qutebrowser-to-firefox.md -> http/pages/blog/qutebrowser-to-firefox.md | 0
Rpages/blog/refining-my-neomutt-config.md -> http/pages/blog/refining-my-neomutt-config.md | 0
Rpages/blog/reflecting-on-50-days-of-blogging.md -> http/pages/blog/reflecting-on-50-days-of-blogging.md | 0
Rpages/blog/rewriting-my-static-site-generator.md -> http/pages/blog/rewriting-my-static-site-generator.md | 0
Rpages/blog/scripting-my-way-to-success.md -> http/pages/blog/scripting-my-way-to-success.md | 0
Rpages/blog/self-hosted-mail-now-live.md -> http/pages/blog/self-hosted-mail-now-live.md | 0
Rpages/blog/self-hosting-email.md -> http/pages/blog/self-hosting-email.md | 0
Rpages/blog/setting-up-a-gopher-site.md -> http/pages/blog/setting-up-a-gopher-site.md | 0
Rpages/blog/setting-up-a-status-page.md -> http/pages/blog/setting-up-a-status-page.md | 0
Rpages/blog/setting-up-gpg-keys-from-scratch.md -> http/pages/blog/setting-up-gpg-keys-from-scratch.md | 0
Rpages/blog/setting-up-weechat-again.md -> http/pages/blog/setting-up-weechat-again.md | 0
Rpages/blog/submitting-a-bug-report-to-freebsd.md -> http/pages/blog/submitting-a-bug-report-to-freebsd.md | 0
Rpages/blog/switching-to-alacritty-removals.md -> http/pages/blog/switching-to-alacritty-removals.md | 0
Rpages/blog/switching-to-alacritty.md -> http/pages/blog/switching-to-alacritty.md | 0
Rpages/blog/switching-to-cgit.md -> http/pages/blog/switching-to-cgit.md | 0
Rpages/blog/switching-to-debian-sid.md -> http/pages/blog/switching-to-debian-sid.md | 0
Rpages/blog/the-diefenbunker-museum.md -> http/pages/blog/the-diefenbunker-museum.md | 0
Rpages/blog/the-disappearance-of-one.md -> http/pages/blog/the-disappearance-of-one.md | 0
Rpages/blog/the-hacker-quarterly-magazine.md -> http/pages/blog/the-hacker-quarterly-magazine.md | 0
Rpages/blog/the-joys-of-old-tech.md -> http/pages/blog/the-joys-of-old-tech.md | 0
Rpages/blog/the-marble-man.md -> http/pages/blog/the-marble-man.md | 0
Rpages/blog/toggling-between-indentation-styles-in-vim.md -> http/pages/blog/toggling-between-indentation-styles-in-vim.md | 0
Rpages/blog/trying-out-aerc.md -> http/pages/blog/trying-out-aerc.md | 0
Rpages/blog/trying-out-dwm.md -> http/pages/blog/trying-out-dwm.md | 0
Rpages/blog/tweaking-some-css.md -> http/pages/blog/tweaking-some-css.md | 0
Rpages/blog/two-months-with-aerc.md -> http/pages/blog/two-months-with-aerc.md | 0
Rpages/blog/two-of-the-most-valuable-lessons-ive-learned.md -> http/pages/blog/two-of-the-most-valuable-lessons-ive-learned.md | 0
Rpages/blog/two-truths-and-a-lie.md -> http/pages/blog/two-truths-and-a-lie.md | 0
Rpages/blog/unsure-what-to-write.md -> http/pages/blog/unsure-what-to-write.md | 0
Rpages/blog/urxvt-to-st.md -> http/pages/blog/urxvt-to-st.md | 0
Rpages/blog/use-syncthing-to-sync-things.md -> http/pages/blog/use-syncthing-to-sync-things.md | 0
Rpages/blog/use-xterm-256color-with-alacritty.md -> http/pages/blog/use-xterm-256color-with-alacritty.md | 0
Rpages/blog/using-rm-with-trash.md -> http/pages/blog/using-rm-with-trash.md | 0
Rpages/blog/vortex-vibe-keyboard.md -> http/pages/blog/vortex-vibe-keyboard.md | 0
Rpages/blog/website-redesign.md -> http/pages/blog/website-redesign.md | 0
Rpages/blog/why-dwm-swallowing-cant-swallow-tmux.md -> http/pages/blog/why-dwm-swallowing-cant-swallow-tmux.md | 0
Rpages/blog/why-email-is-the-best-discussion-platform.md -> http/pages/blog/why-email-is-the-best-discussion-platform.md | 0
Rpages/blog/why-i-blog.md -> http/pages/blog/why-i-blog.md | 0
Rpages/blog/why-i-hate-the-term-modern.md -> http/pages/blog/why-i-hate-the-term-modern.md | 0
Rpages/blog/why-i-love-the-fediverse.md -> http/pages/blog/why-i-love-the-fediverse.md | 0
Rpages/blog/why-irc-is-still-good.md -> http/pages/blog/why-irc-is-still-good.md | 0
Rpages/contact.md -> http/pages/contact.md | 0
Rpages/home.md -> http/pages/home.md | 0
Rpages/links.md -> http/pages/links.md | 0
Rpages/now.md -> http/pages/now.md | 0
Rpages/projects.md -> http/pages/projects.md | 0
Rpages/projects/borderlands-3-dps-calculator.md -> http/pages/projects/borderlands-3-dps-calculator.md | 0
Rpages/projects/dnd/initiative.md -> http/pages/projects/dnd/initiative.md | 0
Rpages/projects/dnd/roll.md -> http/pages/projects/dnd/roll.md | 0
Rpages/projects/kontaktdb.md -> http/pages/projects/kontaktdb.md | 0
Rpages/projects/morrowind-character-roller.md -> http/pages/projects/morrowind-character-roller.md | 0
Rpages/projects/time-duration-calculator.md -> http/pages/projects/time-duration-calculator.md | 0
Rpages/projects/usrmnt.md -> http/pages/projects/usrmnt.md | 0
Rpages/uses.md -> http/pages/uses.md | 0
Rpublic/android-chrome-192x192.png -> http/public/android-chrome-192x192.png | 0
Rpublic/android-chrome-512x512.png -> http/public/android-chrome-512x512.png | 0
Rpublic/apple-touch-icon.png -> http/public/apple-touch-icon.png | 0
Rpublic/blogroll.opml -> http/public/blogroll.opml | 0
Rpublic/browserconfig.xml -> http/public/browserconfig.xml | 0
Rpublic/favicon-16x16.png -> http/public/favicon-16x16.png | 0
Rpublic/favicon-32x32.png -> http/public/favicon-32x32.png | 0
Rpublic/favicon.ico -> http/public/favicon.ico | 0
Rpublic/feeds/sitewide-feed.xml -> http/public/feeds/sitewide-feed.xml | 0
Rpublic/img/banned-ips-now.png -> http/public/img/banned-ips-now.png | 0
Rpublic/img/banned-ips.png -> http/public/img/banned-ips.png | 0
Rpublic/img/brokerage-comparison-thumb.png -> http/public/img/brokerage-comparison-thumb.png | 0
Rpublic/img/brokerage-comparison.png -> http/public/img/brokerage-comparison.png | 0
Rpublic/img/cisco-ssl-error-thumb.png -> http/public/img/cisco-ssl-error-thumb.png | 0
Rpublic/img/cisco-ssl-error.png -> http/public/img/cisco-ssl-error.png | 0
Rpublic/img/debian-openlogo-75.png -> http/public/img/debian-openlogo-75.png | 0
Rpublic/img/debian-with-btrfs/boot-mount.png -> http/public/img/debian-with-btrfs/boot-mount.png | 0
Rpublic/img/debian-with-btrfs/commands-before-boot-mount.png -> http/public/img/debian-with-btrfs/commands-before-boot-mount.png | 0
Rpublic/img/debian-with-btrfs/df.png -> http/public/img/debian-with-btrfs/df.png | 0
Rpublic/img/debian-with-btrfs/partition-results.png -> http/public/img/debian-with-btrfs/partition-results.png | 0
Rpublic/img/debian-with-btrfs/partition-screen.png -> http/public/img/debian-with-btrfs/partition-screen.png | 0
Rpublic/img/debian-with-btrfs/shell.png -> http/public/img/debian-with-btrfs/shell.png | 0
Rpublic/img/debian-with-btrfs/target-fstab.png -> http/public/img/debian-with-btrfs/target-fstab.png | 0
Rpublic/img/diefen/cafeteria-store.jpg -> http/public/img/diefen/cafeteria-store.jpg | 0
Rpublic/img/diefen/comms-rack.jpg -> http/public/img/diefen/comms-rack.jpg | 0
Rpublic/img/diefen/comms-room.jpg -> http/public/img/diefen/comms-room.jpg | 0
Rpublic/img/diefen/computers.jpg -> http/public/img/diefen/computers.jpg | 0
Rpublic/img/diefen/conference-room.jpg -> http/public/img/diefen/conference-room.jpg | 0
Rpublic/img/diefen/hard-disk-platter.jpg -> http/public/img/diefen/hard-disk-platter.jpg | 0
Rpublic/img/diefen/mainframes.jpg -> http/public/img/diefen/mainframes.jpg | 0
Rpublic/img/diefen/operating-theatre.jpg -> http/public/img/diefen/operating-theatre.jpg | 0
Rpublic/img/diefen/oscilloscope.jpg -> http/public/img/diefen/oscilloscope.jpg | 0
Rpublic/img/diefen/situation-room.jpg -> http/public/img/diefen/situation-room.jpg | 0
Rpublic/img/diefen/tape-rack.jpg -> http/public/img/diefen/tape-rack.jpg | 0
Rpublic/img/diefen/thumbnails/cafeteria-store.jpg -> http/public/img/diefen/thumbnails/cafeteria-store.jpg | 0
Rpublic/img/diefen/thumbnails/comms-rack.jpg -> http/public/img/diefen/thumbnails/comms-rack.jpg | 0
Rpublic/img/diefen/thumbnails/comms-room.jpg -> http/public/img/diefen/thumbnails/comms-room.jpg | 0
Rpublic/img/diefen/thumbnails/computers.jpg -> http/public/img/diefen/thumbnails/computers.jpg | 0
Rpublic/img/diefen/thumbnails/conference-room.jpg -> http/public/img/diefen/thumbnails/conference-room.jpg | 0
Rpublic/img/diefen/thumbnails/hard-disk-platter.jpg -> http/public/img/diefen/thumbnails/hard-disk-platter.jpg | 0
Rpublic/img/diefen/thumbnails/mainframes.jpg -> http/public/img/diefen/thumbnails/mainframes.jpg | 0
Rpublic/img/diefen/thumbnails/operating-theatre.jpg -> http/public/img/diefen/thumbnails/operating-theatre.jpg | 0
Rpublic/img/diefen/thumbnails/oscilloscope.jpg -> http/public/img/diefen/thumbnails/oscilloscope.jpg | 0
Rpublic/img/diefen/thumbnails/situation-room.jpg -> http/public/img/diefen/thumbnails/situation-room.jpg | 0
Rpublic/img/diefen/thumbnails/tape-rack.jpg -> http/public/img/diefen/thumbnails/tape-rack.jpg | 0
Rpublic/img/diefen/thumbnails/vintage-computer.jpg -> http/public/img/diefen/thumbnails/vintage-computer.jpg | 0
Rpublic/img/diefen/thumbnails/workshop.jpg -> http/public/img/diefen/thumbnails/workshop.jpg | 0
Rpublic/img/diefen/vintage-computer.jpg -> http/public/img/diefen/vintage-computer.jpg | 0
Rpublic/img/diefen/workshop.jpg -> http/public/img/diefen/workshop.jpg | 0
Rpublic/img/double-desktop-email-thumb.png -> http/public/img/double-desktop-email-thumb.png | 0
Rpublic/img/double-desktop-email.png -> http/public/img/double-desktop-email.png | 0
Rpublic/img/dwm-laptop-thumb.png -> http/public/img/dwm-laptop-thumb.png | 0
Rpublic/img/dwm-laptop.png -> http/public/img/dwm-laptop.png | 0
Rpublic/img/fedora-tablet-desktop-thumb.png -> http/public/img/fedora-tablet-desktop-thumb.png | 0
Rpublic/img/fedora-tablet-desktop.png -> http/public/img/fedora-tablet-desktop.png | 0
Rpublic/img/feed-icon.png -> http/public/img/feed-icon.png | 0
Rpublic/img/firefox-settings-thumb.png -> http/public/img/firefox-settings-thumb.png | 0
Rpublic/img/firefox-settings.png -> http/public/img/firefox-settings.png | 0
Rpublic/img/floppy-thumb.jpg -> http/public/img/floppy-thumb.jpg | 0
Ahttp/public/img/floppy.jpg | 0
Ahttp/public/img/giorno-3.png | 0
Ahttp/public/img/hacker-quarterly-thumb.jpg | 0
Ahttp/public/img/hacker-quarterly.jpg | 0
Ahttp/public/img/home-directory.png | 0
Ahttp/public/img/husky-screenshot-thumb.png | 0
Ahttp/public/img/husky-screenshot.png | 0
Ahttp/public/img/keyboard-side-thumb.jpg | 0
Ahttp/public/img/keyboard-side.jpg | 0
Ahttp/public/img/keyboard-top-thumb.jpg | 0
Ahttp/public/img/keyboard-top.jpg | 0
Ahttp/public/img/laptop-open-with-touchpad-thumb.jpg | 0
Ahttp/public/img/laptop-open-with-touchpad.jpg | 0
Ahttp/public/img/laptop-screenshot-old-thumb.png | 0
Ahttp/public/img/laptop-screenshot-old.png | 0
Ahttp/public/img/live-testing-touchpad-thumb.jpg | 0
Ahttp/public/img/live-testing-touchpad.jpg | 0
Ahttp/public/img/logo-256.png | 0
Ahttp/public/img/logo-256x256.png | 0
Ahttp/public/img/logo-ftp.png | 0
Ahttp/public/img/logo-git-256.png | 0
Ahttp/public/img/logo-git.png | 0
Ahttp/public/img/logo-main-256.png | 0
Ahttp/public/img/logo-main.png | 0
Ahttp/public/img/logo-mastodon.png | 0
Ahttp/public/img/logo-matrix.png | 0
Ahttp/public/img/logo-pleroma-128.png | 0
Ahttp/public/img/logo-pleroma-32.png | 0
Ahttp/public/img/logo-pleroma-512.png | 0
Ahttp/public/img/logo-wiki.png | 0
Ahttp/public/img/ls-highlights.png | 0
Ahttp/public/img/ls-no-highlights.png | 0
Ahttp/public/img/lwn-homepage-colours.png | 0
Ahttp/public/img/lwn-we-colours.png | 0
Ahttp/public/img/mastodon-error-thumb.png | 0
Ahttp/public/img/mastodon-error.png | 0
Ahttp/public/img/mastodon-status-announcement.png | 0
Ahttp/public/img/more-banned-ips.png | 0
Ahttp/public/img/mx-toolbox-results-thumb.png | 0
Ahttp/public/img/mx-toolbox-results.png | 0
Ahttp/public/img/neomutt-threading.png | 0
Ahttp/public/img/neomutt-thumb.png | 0
Ahttp/public/img/neomutt.png | 0
Ahttp/public/img/office-365-spam-thumb.png | 0
Ahttp/public/img/office-365-spam.png | 0
Ahttp/public/img/old-logo.png | 0
Ahttp/public/img/paritybit-gopher-lynx-thumb.png | 0
Ahttp/public/img/paritybit-gopher-lynx.png | 0
Ahttp/public/img/projects/usrmnt/screenshot.png | 0
Ahttp/public/img/reporting-cisco-error-thumb.png | 0
Ahttp/public/img/reporting-cisco-error.png | 0
Ahttp/public/img/seo-report.png | 0
Ahttp/public/img/slack-tracking.png | 0
Ahttp/public/img/st-lynx-thumb.png | 0
Ahttp/public/img/st-lynx.png | 0
Ahttp/public/img/st-tc.png | 0
Ahttp/public/img/st-vim.png | 0
Ahttp/public/img/syncthing-dashboard-thumb.png | 0
Ahttp/public/img/syncthing-dashboard.png | 0
Ahttp/public/img/t420s/laptop-looking-good-thumb.jpg | 0
Ahttp/public/img/t420s/laptop-looking-good.jpg | 0
Ahttp/public/img/t420s/new-sticker-thumb.jpg | 0
Ahttp/public/img/t420s/new-sticker.jpg | 0
Ahttp/public/img/t420s/t420s-close-thumb.jpg | 0
Ahttp/public/img/t420s/t420s-close.jpg | 0
Ahttp/public/img/t420s/t420s-thinklight-thumb.jpg | 0
Ahttp/public/img/t420s/t420s-thinklight.jpg | 0
Ahttp/public/img/t420s/t420s-trackpad-thumb.jpg | 0
Ahttp/public/img/t420s/t420s-trackpad.jpg | 0
Ahttp/public/img/t420s/t420s-wide-thumb.jpg | 0
Ahttp/public/img/t420s/t420s-wide.jpg | 0
Ahttp/public/img/urxvt-lynx-thumb.png | 0
Ahttp/public/img/urxvt-lynx.png | 0
Ahttp/public/img/urxvt-tc.png | 0
Ahttp/public/img/urxvt-vim.png | 0
Ahttp/public/img/valid-rss-rogers.png | 0
Ahttp/public/img/vcss.gif | 0
Ahttp/public/img/vim-airline.gif | 0
Ahttp/public/img/vim-airline.mp4 | 0
Ahttp/public/img/vim-no-airline.gif | 0
Ahttp/public/img/vim-no-airline.mp4 | 0
Ahttp/public/js/borderlands-3-dps-calculator.js | 151++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Ahttp/public/js/generator.js | 79+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Ahttp/public/js/initiative.js | 171+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Ahttp/public/js/roll.js | 147+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Ahttp/public/js/time-duration-calculator.js | 116+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Ahttp/public/mstile-144x144.png | 0
Ahttp/public/mstile-150x150.png | 0
Ahttp/public/mstile-310x150.png | 0
Ahttp/public/mstile-310x310.png | 0
Ahttp/public/mstile-70x70.png | 0
Ahttp/public/robots.txt | 3+++
Ahttp/public/safari-pinned-tab.svg | 2++
Ahttp/public/site.webmanifest | 19+++++++++++++++++++
Ahttp/public/sitemap.xml | 130+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Ahttp/public/vid/noswallow-animated-thumb.webm | 0
Ahttp/public/vid/noswallow-animated.webm | 0
Ahttp/public/vid/swallow-animated-thumb.webm | 0
Ahttp/public/vid/swallow-animated.webm | 0
Ahttp/publish | 265+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Ahttp/style/borderlands.css | 51+++++++++++++++++++++++++++++++++++++++++++++++++++
Ahttp/style/initiative.css | 53+++++++++++++++++++++++++++++++++++++++++++++++++++++
Ahttp/style/main.css | 293+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Ahttp/style/morrowind.css | 94+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Ahttp/style/roll.css | 207+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Ahttp/style/tdc.css | 66++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Ahttp/tuptime-update.pl | 61+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Ahttp/uploadwatch.sh | 9+++++++++
Dpublic/img/floppy.jpg | 0
Dpublic/img/giorno-3.png | 0
Dpublic/img/hacker-quarterly-thumb.jpg | 0
Dpublic/img/hacker-quarterly.jpg | 0
Dpublic/img/home-directory.png | 0
Dpublic/img/husky-screenshot-thumb.png | 0
Dpublic/img/husky-screenshot.png | 0
Dpublic/img/keyboard-side-thumb.jpg | 0
Dpublic/img/keyboard-side.jpg | 0
Dpublic/img/keyboard-top-thumb.jpg | 0
Dpublic/img/keyboard-top.jpg | 0
Dpublic/img/laptop-open-with-touchpad-thumb.jpg | 0
Dpublic/img/laptop-open-with-touchpad.jpg | 0
Dpublic/img/laptop-screenshot-old-thumb.png | 0
Dpublic/img/laptop-screenshot-old.png | 0
Dpublic/img/live-testing-touchpad-thumb.jpg | 0
Dpublic/img/live-testing-touchpad.jpg | 0
Dpublic/img/logo-256.png | 0
Dpublic/img/logo-256x256.png | 0
Dpublic/img/logo-ftp.png | 0
Dpublic/img/logo-git-256.png | 0
Dpublic/img/logo-git.png | 0
Dpublic/img/logo-main-256.png | 0
Dpublic/img/logo-main.png | 0
Dpublic/img/logo-mastodon.png | 0
Dpublic/img/logo-matrix.png | 0
Dpublic/img/logo-pleroma-128.png | 0
Dpublic/img/logo-pleroma-32.png | 0
Dpublic/img/logo-pleroma-512.png | 0
Dpublic/img/logo-wiki.png | 0
Dpublic/img/ls-highlights.png | 0
Dpublic/img/ls-no-highlights.png | 0
Dpublic/img/lwn-homepage-colours.png | 0
Dpublic/img/lwn-we-colours.png | 0
Dpublic/img/mastodon-error-thumb.png | 0
Dpublic/img/mastodon-error.png | 0
Dpublic/img/mastodon-status-announcement.png | 0
Dpublic/img/more-banned-ips.png | 0
Dpublic/img/mx-toolbox-results-thumb.png | 0
Dpublic/img/mx-toolbox-results.png | 0
Dpublic/img/neomutt-threading.png | 0
Dpublic/img/neomutt-thumb.png | 0
Dpublic/img/neomutt.png | 0
Dpublic/img/office-365-spam-thumb.png | 0
Dpublic/img/office-365-spam.png | 0
Dpublic/img/old-logo.png | 0
Dpublic/img/paritybit-gopher-lynx-thumb.png | 0
Dpublic/img/paritybit-gopher-lynx.png | 0
Dpublic/img/projects/usrmnt/screenshot.png | 0
Dpublic/img/reporting-cisco-error-thumb.png | 0
Dpublic/img/reporting-cisco-error.png | 0
Dpublic/img/seo-report.png | 0
Dpublic/img/slack-tracking.png | 0
Dpublic/img/st-lynx-thumb.png | 0
Dpublic/img/st-lynx.png | 0
Dpublic/img/st-tc.png | 0
Dpublic/img/st-vim.png | 0
Dpublic/img/syncthing-dashboard-thumb.png | 0
Dpublic/img/syncthing-dashboard.png | 0
Dpublic/img/t420s/laptop-looking-good-thumb.jpg | 0
Dpublic/img/t420s/laptop-looking-good.jpg | 0
Dpublic/img/t420s/new-sticker-thumb.jpg | 0
Dpublic/img/t420s/new-sticker.jpg | 0
Dpublic/img/t420s/t420s-close-thumb.jpg | 0
Dpublic/img/t420s/t420s-close.jpg | 0
Dpublic/img/t420s/t420s-thinklight-thumb.jpg | 0
Dpublic/img/t420s/t420s-thinklight.jpg | 0
Dpublic/img/t420s/t420s-trackpad-thumb.jpg | 0
Dpublic/img/t420s/t420s-trackpad.jpg | 0
Dpublic/img/t420s/t420s-wide-thumb.jpg | 0
Dpublic/img/t420s/t420s-wide.jpg | 0
Dpublic/img/urxvt-lynx-thumb.png | 0
Dpublic/img/urxvt-lynx.png | 0
Dpublic/img/urxvt-tc.png | 0
Dpublic/img/urxvt-vim.png | 0
Dpublic/img/valid-rss-rogers.png | 0
Dpublic/img/vcss.gif | 0
Dpublic/img/vim-airline.gif | 0
Dpublic/img/vim-airline.mp4 | 0
Dpublic/img/vim-no-airline.gif | 0
Dpublic/img/vim-no-airline.mp4 | 0
Dpublic/js/borderlands-3-dps-calculator.js | 151------------------------------------------------------------------------------
Dpublic/js/generator.js | 79-------------------------------------------------------------------------------
Dpublic/js/initiative.js | 171-------------------------------------------------------------------------------
Dpublic/js/roll.js | 147-------------------------------------------------------------------------------
Dpublic/js/time-duration-calculator.js | 116-------------------------------------------------------------------------------
Dpublic/mstile-144x144.png | 0
Dpublic/mstile-150x150.png | 0
Dpublic/mstile-310x150.png | 0
Dpublic/mstile-310x310.png | 0
Dpublic/mstile-70x70.png | 0
Dpublic/robots.txt | 3---
Dpublic/safari-pinned-tab.svg | 2--
Dpublic/site.webmanifest | 19-------------------
Dpublic/sitemap.xml | 130-------------------------------------------------------------------------------
Dpublic/vid/noswallow-animated-thumb.webm | 0
Dpublic/vid/noswallow-animated.webm | 0
Dpublic/vid/swallow-animated-thumb.webm | 0
Dpublic/vid/swallow-animated.webm | 0
Dpublish | 265-------------------------------------------------------------------------------
Dstyle/borderlands.css | 51---------------------------------------------------
Dstyle/initiative.css | 53-----------------------------------------------------
Dstyle/main.css | 293-------------------------------------------------------------------------------
Dstyle/morrowind.css | 94-------------------------------------------------------------------------------
Dstyle/roll.css | 207-------------------------------------------------------------------------------
Dstyle/tdc.css | 66------------------------------------------------------------------
Dtuptime-update.pl | 61-------------------------------------------------------------
Duploadwatch.sh | 9---------
417 files changed, 1926 insertions(+), 1964 deletions(-)

diff --git a/.gitignore b/.gitignore @@ -1,12 +1,12 @@ # Ignore generated output files -public/feeds/*.bak -public/html/** -public/gopher/** -public/gemini/** -public/css/** +http/public/feeds/*.bak +http/public/html/** +http/public/gopher/** +http/public/gemini/** +http/public/css/** # Ignore intermediate build files except header/footer/logos -build/* -!build/logos/ -!build/heater.html -!build/footer.html +http/build/* +!http/build/logos/ +!http/build/heater.html +!http/build/footer.html diff --git a/build/header.html b/build/header.html @@ -1,38 +0,0 @@ -<!DOCTYPE html> -<html lang="en"> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1.0"> - <meta name="description" content=""> - <link rel="alternate" type="application/rss+xml" title="RSS feed" - href="https://www.paritybit.ca/feeds/sitewide-feed.xml"> - <link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png"> - <link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png"> - <link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png"> - <link rel="manifest" href="/site.webmanifest"> - <link rel="mask-icon" href="/safari-pinned-tab.svg" color="#5bbad5"> - <meta name="msapplication-TileColor" content="#da532c"> - <meta name="theme-color" content="#ffffff"> - <title>paritybit.ca</title> -</head> -<body> - <header id="header"> - <!-- <p class="note">All paritybit.ca services will be offline starting --> - <!-- 2020-08-31T01:00:00Z until 2020-09-03T01:00:00Z or earlier. Mail --> - <!-- services will remain unaffected.</p> --> - <h1>paritybit.ca</h1> - </header> - <nav id="navigation"> - <a href="/">Home</a> - <a href="/blog">Blog</a> - <a href="/links">Links</a> - <a href="/projects">Projects</a> - <a href="/about">About</a> - <a href="/uses">Uses</a> - <a href="/now">Now</a> - <a href="/contact">Contact</a> - </nav> - <hr> - <main> - <!--TOC--> -<!-- END OF HEADER FILE --> diff --git a/build/footer.html b/http/build/footer.html diff --git a/build/logos/logo-ftp.svg b/http/build/logos/logo-ftp.svg diff --git a/build/logos/logo-git.svg b/http/build/logos/logo-git.svg diff --git a/build/logos/logo-main.svg b/http/build/logos/logo-main.svg diff --git a/build/logos/logo-mastodon.svg b/http/build/logos/logo-mastodon.svg diff --git a/build/logos/logo-status-uptimerobot.svg b/http/build/logos/logo-status-uptimerobot.svg diff --git a/build/logos/logo-status.svg b/http/build/logos/logo-status.svg diff --git a/build/logos/logo-wiki.svg b/http/build/logos/logo-wiki.svg diff --git a/build/logos/logo.svg b/http/build/logos/logo.svg diff --git a/compile b/http/compile diff --git a/generate-blogroll.sh b/http/generate-blogroll.sh diff --git a/pages/404.md b/http/pages/404.md diff --git a/pages/about-site.md b/http/pages/about-site.md diff --git a/pages/about.md b/http/pages/about.md diff --git a/pages/blog.md b/http/pages/blog.md diff --git a/pages/blog/a-brief-review-of-fedora-32.md b/http/pages/blog/a-brief-review-of-fedora-32.md diff --git a/pages/blog/a-month-and-a-half-of-self-hosted-email.md b/http/pages/blog/a-month-and-a-half-of-self-hosted-email.md diff --git a/pages/blog/a-quick-rant-about-web-font-sizes.md b/http/pages/blog/a-quick-rant-about-web-font-sizes.md diff --git a/pages/blog/adding-image-optimization-to-my-static-site-generator.md b/http/pages/blog/adding-image-optimization-to-my-static-site-generator.md diff --git a/pages/blog/adding-search-to-my-blog.md b/http/pages/blog/adding-search-to-my-blog.md diff --git a/pages/blog/announcing-kontaktb.md b/http/pages/blog/announcing-kontaktb.md diff --git a/pages/blog/are-todo-applications-a-waste-of-time.md b/http/pages/blog/are-todo-applications-a-waste-of-time.md diff --git a/pages/blog/arguing-effectively.md b/http/pages/blog/arguing-effectively.md diff --git a/pages/blog/attempting-to-replace-my-thinkpads-touchpad.md b/http/pages/blog/attempting-to-replace-my-thinkpads-touchpad.md diff --git a/pages/blog/automating-publishing.md b/http/pages/blog/automating-publishing.md diff --git a/pages/blog/be-a-good-netizen.md b/http/pages/blog/be-a-good-netizen.md diff --git a/pages/blog/book-review-the-mediocre-programmer.md b/http/pages/blog/book-review-the-mediocre-programmer.md diff --git a/pages/blog/btw-i-use-arch.md b/http/pages/blog/btw-i-use-arch.md diff --git a/pages/blog/caring-about-seo.md b/http/pages/blog/caring-about-seo.md diff --git a/pages/blog/cat-v-considered-harmful.md b/http/pages/blog/cat-v-considered-harmful.md diff --git a/pages/blog/china.md b/http/pages/blog/china.md diff --git a/pages/blog/choosing-a-self-hosted-git-service.md b/http/pages/blog/choosing-a-self-hosted-git-service.md diff --git a/pages/blog/choosing-an-investment-brokerage.md b/http/pages/blog/choosing-an-investment-brokerage.md diff --git a/pages/blog/clone-wars-finale.md b/http/pages/blog/clone-wars-finale.md diff --git a/pages/blog/colours-for-gitea-issues.md b/http/pages/blog/colours-for-gitea-issues.md diff --git a/pages/blog/curating-my-blogroll.md b/http/pages/blog/curating-my-blogroll.md diff --git a/pages/blog/debian-with-btrfs.md b/http/pages/blog/debian-with-btrfs.md diff --git a/pages/blog/decommissioning-my-rackmount-server.md b/http/pages/blog/decommissioning-my-rackmount-server.md diff --git a/pages/blog/difficulty-of-privacy-education.md b/http/pages/blog/difficulty-of-privacy-education.md diff --git a/pages/blog/diving-deeper-into-the-small-internet.md b/http/pages/blog/diving-deeper-into-the-small-internet.md diff --git a/pages/blog/dnd-xp-system.md b/http/pages/blog/dnd-xp-system.md diff --git a/pages/blog/ethical-investing.md b/http/pages/blog/ethical-investing.md diff --git a/pages/blog/generating-my-geek-code.md b/http/pages/blog/generating-my-geek-code.md diff --git a/pages/blog/gentoo-isnt-for-me.md b/http/pages/blog/gentoo-isnt-for-me.md diff --git a/pages/blog/going-from-user-to-contributor-with-foss.md b/http/pages/blog/going-from-user-to-contributor-with-foss.md diff --git a/pages/blog/gomux-is-the-best-cli-matrix-client.md b/http/pages/blog/gomux-is-the-best-cli-matrix-client.md diff --git a/pages/blog/housecleaning.md b/http/pages/blog/housecleaning.md diff --git a/pages/blog/how-far-translation-tools-have-come.md b/http/pages/blog/how-far-translation-tools-have-come.md diff --git a/pages/blog/how-i-keep-my-home-directory-clean.md b/http/pages/blog/how-i-keep-my-home-directory-clean.md diff --git a/pages/blog/how-i-manage-my-dotfiles.md b/http/pages/blog/how-i-manage-my-dotfiles.md diff --git a/pages/blog/how-much-ram-is-enough.md b/http/pages/blog/how-much-ram-is-enough.md diff --git a/pages/blog/how-to-create-an-rss-feed-for-your-blog-1.md b/http/pages/blog/how-to-create-an-rss-feed-for-your-blog-1.md diff --git a/pages/blog/how-to-create-an-rss-feed-for-your-blog-2.md b/http/pages/blog/how-to-create-an-rss-feed-for-your-blog-2.md diff --git a/pages/blog/how-to-create-an-rss-feed-for-your-blog-3.md b/http/pages/blog/how-to-create-an-rss-feed-for-your-blog-3.md diff --git a/pages/blog/how-to-not-make-an-ass-of-yourself-internet-discussions.md b/http/pages/blog/how-to-not-make-an-ass-of-yourself-internet-discussions.md diff --git a/pages/blog/i-got-more-ram.md b/http/pages/blog/i-got-more-ram.md diff --git a/pages/blog/i-like-perl.md b/http/pages/blog/i-like-perl.md diff --git a/pages/blog/i-was-wrong.md b/http/pages/blog/i-was-wrong.md diff --git a/pages/blog/improving-blog-searching.md b/http/pages/blog/improving-blog-searching.md diff --git a/pages/blog/improving-my-blog-post-publishing-script.md b/http/pages/blog/improving-my-blog-post-publishing-script.md diff --git a/pages/blog/interesting-things-for-today.md b/http/pages/blog/interesting-things-for-today.md diff --git a/pages/blog/it-doesnt-have-to-be-perfect.md b/http/pages/blog/it-doesnt-have-to-be-perfect.md diff --git a/pages/blog/logo-redesign.md b/http/pages/blog/logo-redesign.md diff --git a/pages/blog/machine-hostnames.md b/http/pages/blog/machine-hostnames.md diff --git a/pages/blog/making-my-own-vim-statusline.md b/http/pages/blog/making-my-own-vim-statusline.md diff --git a/pages/blog/making-my-site-easier-to-read.md b/http/pages/blog/making-my-site-easier-to-read.md diff --git a/pages/blog/mastodon-to-pleroma-1-setting-up-a-pleroma-server.md b/http/pages/blog/mastodon-to-pleroma-1-setting-up-a-pleroma-server.md diff --git a/pages/blog/mastodon-to-pleroma-2-customizing-my-instance.md b/http/pages/blog/mastodon-to-pleroma-2-customizing-my-instance.md diff --git a/pages/blog/mastodon-to-pleroma-3-shutting-down-mastodon.md b/http/pages/blog/mastodon-to-pleroma-3-shutting-down-mastodon.md diff --git a/pages/blog/migrating-my-wiki-off-of-mediawiki.md b/http/pages/blog/migrating-my-wiki-off-of-mediawiki.md diff --git a/pages/blog/my-attempts-to-fix-my-mastodon-instance.md b/http/pages/blog/my-attempts-to-fix-my-mastodon-instance.md diff --git a/pages/blog/my-beginnings-with-gentoo.md b/http/pages/blog/my-beginnings-with-gentoo.md diff --git a/pages/blog/my-first-ctf.md b/http/pages/blog/my-first-ctf.md diff --git a/pages/blog/my-git-server-was-ddosed.md b/http/pages/blog/my-git-server-was-ddosed.md diff --git a/pages/blog/my-journey-with-computers.md b/http/pages/blog/my-journey-with-computers.md diff --git a/pages/blog/my-lwn-theme.md b/http/pages/blog/my-lwn-theme.md diff --git a/pages/blog/my-new-t420s.md b/http/pages/blog/my-new-t420s.md diff --git a/pages/blog/my-preferred-fediverse-mobile-client.md b/http/pages/blog/my-preferred-fediverse-mobile-client.md diff --git a/pages/blog/my-todo-solution.md b/http/pages/blog/my-todo-solution.md diff --git a/pages/blog/my-top-10-most-used-commands.md b/http/pages/blog/my-top-10-most-used-commands.md diff --git a/pages/blog/new-desktop-checklist.md b/http/pages/blog/new-desktop-checklist.md diff --git a/pages/blog/new-server-checklist.md b/http/pages/blog/new-server-checklist.md diff --git a/pages/blog/nope-back-to-st.md b/http/pages/blog/nope-back-to-st.md diff --git a/pages/blog/paying-for-software.md b/http/pages/blog/paying-for-software.md diff --git a/pages/blog/posting-statuses-on-pleroma-with-a-shell-script.md b/http/pages/blog/posting-statuses-on-pleroma-with-a-shell-script.md diff --git a/pages/blog/preparing-to-self-host-email.md b/http/pages/blog/preparing-to-self-host-email.md diff --git a/pages/blog/qutebrowser-to-firefox.md b/http/pages/blog/qutebrowser-to-firefox.md diff --git a/pages/blog/refining-my-neomutt-config.md b/http/pages/blog/refining-my-neomutt-config.md diff --git a/pages/blog/reflecting-on-50-days-of-blogging.md b/http/pages/blog/reflecting-on-50-days-of-blogging.md diff --git a/pages/blog/rewriting-my-static-site-generator.md b/http/pages/blog/rewriting-my-static-site-generator.md diff --git a/pages/blog/scripting-my-way-to-success.md b/http/pages/blog/scripting-my-way-to-success.md diff --git a/pages/blog/self-hosted-mail-now-live.md b/http/pages/blog/self-hosted-mail-now-live.md diff --git a/pages/blog/self-hosting-email.md b/http/pages/blog/self-hosting-email.md diff --git a/pages/blog/setting-up-a-gopher-site.md b/http/pages/blog/setting-up-a-gopher-site.md diff --git a/pages/blog/setting-up-a-status-page.md b/http/pages/blog/setting-up-a-status-page.md diff --git a/pages/blog/setting-up-gpg-keys-from-scratch.md b/http/pages/blog/setting-up-gpg-keys-from-scratch.md diff --git a/pages/blog/setting-up-weechat-again.md b/http/pages/blog/setting-up-weechat-again.md diff --git a/pages/blog/submitting-a-bug-report-to-freebsd.md b/http/pages/blog/submitting-a-bug-report-to-freebsd.md diff --git a/pages/blog/switching-to-alacritty-removals.md b/http/pages/blog/switching-to-alacritty-removals.md diff --git a/pages/blog/switching-to-alacritty.md b/http/pages/blog/switching-to-alacritty.md diff --git a/pages/blog/switching-to-cgit.md b/http/pages/blog/switching-to-cgit.md diff --git a/pages/blog/switching-to-debian-sid.md b/http/pages/blog/switching-to-debian-sid.md diff --git a/pages/blog/the-diefenbunker-museum.md b/http/pages/blog/the-diefenbunker-museum.md diff --git a/pages/blog/the-disappearance-of-one.md b/http/pages/blog/the-disappearance-of-one.md diff --git a/pages/blog/the-hacker-quarterly-magazine.md b/http/pages/blog/the-hacker-quarterly-magazine.md diff --git a/pages/blog/the-joys-of-old-tech.md b/http/pages/blog/the-joys-of-old-tech.md diff --git a/pages/blog/the-marble-man.md b/http/pages/blog/the-marble-man.md diff --git a/pages/blog/toggling-between-indentation-styles-in-vim.md b/http/pages/blog/toggling-between-indentation-styles-in-vim.md diff --git a/pages/blog/trying-out-aerc.md b/http/pages/blog/trying-out-aerc.md diff --git a/pages/blog/trying-out-dwm.md b/http/pages/blog/trying-out-dwm.md diff --git a/pages/blog/tweaking-some-css.md b/http/pages/blog/tweaking-some-css.md diff --git a/pages/blog/two-months-with-aerc.md b/http/pages/blog/two-months-with-aerc.md diff --git a/pages/blog/two-of-the-most-valuable-lessons-ive-learned.md b/http/pages/blog/two-of-the-most-valuable-lessons-ive-learned.md diff --git a/pages/blog/two-truths-and-a-lie.md b/http/pages/blog/two-truths-and-a-lie.md diff --git a/pages/blog/unsure-what-to-write.md b/http/pages/blog/unsure-what-to-write.md diff --git a/pages/blog/urxvt-to-st.md b/http/pages/blog/urxvt-to-st.md diff --git a/pages/blog/use-syncthing-to-sync-things.md b/http/pages/blog/use-syncthing-to-sync-things.md diff --git a/pages/blog/use-xterm-256color-with-alacritty.md b/http/pages/blog/use-xterm-256color-with-alacritty.md diff --git a/pages/blog/using-rm-with-trash.md b/http/pages/blog/using-rm-with-trash.md diff --git a/pages/blog/vortex-vibe-keyboard.md b/http/pages/blog/vortex-vibe-keyboard.md diff --git a/pages/blog/website-redesign.md b/http/pages/blog/website-redesign.md diff --git a/pages/blog/why-dwm-swallowing-cant-swallow-tmux.md b/http/pages/blog/why-dwm-swallowing-cant-swallow-tmux.md Binary files differ. diff --git a/pages/blog/why-email-is-the-best-discussion-platform.md b/http/pages/blog/why-email-is-the-best-discussion-platform.md diff --git a/pages/blog/why-i-blog.md b/http/pages/blog/why-i-blog.md diff --git a/pages/blog/why-i-hate-the-term-modern.md b/http/pages/blog/why-i-hate-the-term-modern.md diff --git a/pages/blog/why-i-love-the-fediverse.md b/http/pages/blog/why-i-love-the-fediverse.md diff --git a/pages/blog/why-irc-is-still-good.md b/http/pages/blog/why-irc-is-still-good.md diff --git a/pages/contact.md b/http/pages/contact.md diff --git a/pages/home.md b/http/pages/home.md diff --git a/pages/links.md b/http/pages/links.md diff --git a/pages/now.md b/http/pages/now.md diff --git a/pages/projects.md b/http/pages/projects.md diff --git a/pages/projects/borderlands-3-dps-calculator.md b/http/pages/projects/borderlands-3-dps-calculator.md diff --git a/pages/projects/dnd/initiative.md b/http/pages/projects/dnd/initiative.md diff --git a/pages/projects/dnd/roll.md b/http/pages/projects/dnd/roll.md diff --git a/pages/projects/kontaktdb.md b/http/pages/projects/kontaktdb.md diff --git a/pages/projects/morrowind-character-roller.md b/http/pages/projects/morrowind-character-roller.md diff --git a/pages/projects/time-duration-calculator.md b/http/pages/projects/time-duration-calculator.md diff --git a/pages/projects/usrmnt.md b/http/pages/projects/usrmnt.md diff --git a/pages/uses.md b/http/pages/uses.md diff --git a/public/android-chrome-192x192.png b/http/public/android-chrome-192x192.png Binary files differ. diff --git a/public/android-chrome-512x512.png b/http/public/android-chrome-512x512.png Binary files differ. diff --git a/public/apple-touch-icon.png b/http/public/apple-touch-icon.png Binary files differ. diff --git a/public/blogroll.opml b/http/public/blogroll.opml diff --git a/public/browserconfig.xml b/http/public/browserconfig.xml diff --git a/public/favicon-16x16.png b/http/public/favicon-16x16.png Binary files differ. diff --git a/public/favicon-32x32.png b/http/public/favicon-32x32.png Binary files differ. diff --git a/public/favicon.ico b/http/public/favicon.ico Binary files differ. diff --git a/public/feeds/sitewide-feed.xml b/http/public/feeds/sitewide-feed.xml diff --git a/public/img/banned-ips-now.png b/http/public/img/banned-ips-now.png Binary files differ. diff --git a/public/img/banned-ips.png b/http/public/img/banned-ips.png Binary files differ. diff --git a/public/img/brokerage-comparison-thumb.png b/http/public/img/brokerage-comparison-thumb.png Binary files differ. diff --git a/public/img/brokerage-comparison.png b/http/public/img/brokerage-comparison.png Binary files differ. diff --git a/public/img/cisco-ssl-error-thumb.png b/http/public/img/cisco-ssl-error-thumb.png Binary files differ. diff --git a/public/img/cisco-ssl-error.png b/http/public/img/cisco-ssl-error.png Binary files differ. diff --git a/public/img/debian-openlogo-75.png b/http/public/img/debian-openlogo-75.png Binary files differ. diff --git a/public/img/debian-with-btrfs/boot-mount.png b/http/public/img/debian-with-btrfs/boot-mount.png Binary files differ. diff --git a/public/img/debian-with-btrfs/commands-before-boot-mount.png b/http/public/img/debian-with-btrfs/commands-before-boot-mount.png Binary files differ. diff --git a/public/img/debian-with-btrfs/df.png b/http/public/img/debian-with-btrfs/df.png Binary files differ. diff --git a/public/img/debian-with-btrfs/partition-results.png b/http/public/img/debian-with-btrfs/partition-results.png Binary files differ. diff --git a/public/img/debian-with-btrfs/partition-screen.png b/http/public/img/debian-with-btrfs/partition-screen.png Binary files differ. diff --git a/public/img/debian-with-btrfs/shell.png b/http/public/img/debian-with-btrfs/shell.png Binary files differ. diff --git a/public/img/debian-with-btrfs/target-fstab.png b/http/public/img/debian-with-btrfs/target-fstab.png Binary files differ. diff --git a/public/img/diefen/cafeteria-store.jpg b/http/public/img/diefen/cafeteria-store.jpg Binary files differ. diff --git a/public/img/diefen/comms-rack.jpg b/http/public/img/diefen/comms-rack.jpg Binary files differ. diff --git a/public/img/diefen/comms-room.jpg b/http/public/img/diefen/comms-room.jpg Binary files differ. diff --git a/public/img/diefen/computers.jpg b/http/public/img/diefen/computers.jpg Binary files differ. diff --git a/public/img/diefen/conference-room.jpg b/http/public/img/diefen/conference-room.jpg Binary files differ. diff --git a/public/img/diefen/hard-disk-platter.jpg b/http/public/img/diefen/hard-disk-platter.jpg Binary files differ. diff --git a/public/img/diefen/mainframes.jpg b/http/public/img/diefen/mainframes.jpg Binary files differ. diff --git a/public/img/diefen/operating-theatre.jpg b/http/public/img/diefen/operating-theatre.jpg Binary files differ. diff --git a/public/img/diefen/oscilloscope.jpg b/http/public/img/diefen/oscilloscope.jpg Binary files differ. diff --git a/public/img/diefen/situation-room.jpg b/http/public/img/diefen/situation-room.jpg Binary files differ. diff --git a/public/img/diefen/tape-rack.jpg b/http/public/img/diefen/tape-rack.jpg Binary files differ. diff --git a/public/img/diefen/thumbnails/cafeteria-store.jpg b/http/public/img/diefen/thumbnails/cafeteria-store.jpg Binary files differ. diff --git a/public/img/diefen/thumbnails/comms-rack.jpg b/http/public/img/diefen/thumbnails/comms-rack.jpg Binary files differ. diff --git a/public/img/diefen/thumbnails/comms-room.jpg b/http/public/img/diefen/thumbnails/comms-room.jpg Binary files differ. diff --git a/public/img/diefen/thumbnails/computers.jpg b/http/public/img/diefen/thumbnails/computers.jpg Binary files differ. diff --git a/public/img/diefen/thumbnails/conference-room.jpg b/http/public/img/diefen/thumbnails/conference-room.jpg Binary files differ. diff --git a/public/img/diefen/thumbnails/hard-disk-platter.jpg b/http/public/img/diefen/thumbnails/hard-disk-platter.jpg Binary files differ. diff --git a/public/img/diefen/thumbnails/mainframes.jpg b/http/public/img/diefen/thumbnails/mainframes.jpg Binary files differ. diff --git a/public/img/diefen/thumbnails/operating-theatre.jpg b/http/public/img/diefen/thumbnails/operating-theatre.jpg Binary files differ. diff --git a/public/img/diefen/thumbnails/oscilloscope.jpg b/http/public/img/diefen/thumbnails/oscilloscope.jpg Binary files differ. diff --git a/public/img/diefen/thumbnails/situation-room.jpg b/http/public/img/diefen/thumbnails/situation-room.jpg Binary files differ. diff --git a/public/img/diefen/thumbnails/tape-rack.jpg b/http/public/img/diefen/thumbnails/tape-rack.jpg Binary files differ. diff --git a/public/img/diefen/thumbnails/vintage-computer.jpg b/http/public/img/diefen/thumbnails/vintage-computer.jpg Binary files differ. diff --git a/public/img/diefen/thumbnails/workshop.jpg b/http/public/img/diefen/thumbnails/workshop.jpg Binary files differ. diff --git a/public/img/diefen/vintage-computer.jpg b/http/public/img/diefen/vintage-computer.jpg Binary files differ. diff --git a/public/img/diefen/workshop.jpg b/http/public/img/diefen/workshop.jpg Binary files differ. diff --git a/public/img/double-desktop-email-thumb.png b/http/public/img/double-desktop-email-thumb.png Binary files differ. diff --git a/public/img/double-desktop-email.png b/http/public/img/double-desktop-email.png Binary files differ. diff --git a/public/img/dwm-laptop-thumb.png b/http/public/img/dwm-laptop-thumb.png Binary files differ. diff --git a/public/img/dwm-laptop.png b/http/public/img/dwm-laptop.png Binary files differ. diff --git a/public/img/fedora-tablet-desktop-thumb.png b/http/public/img/fedora-tablet-desktop-thumb.png Binary files differ. diff --git a/public/img/fedora-tablet-desktop.png b/http/public/img/fedora-tablet-desktop.png Binary files differ. diff --git a/public/img/feed-icon.png b/http/public/img/feed-icon.png Binary files differ. diff --git a/public/img/firefox-settings-thumb.png b/http/public/img/firefox-settings-thumb.png Binary files differ. diff --git a/public/img/firefox-settings.png b/http/public/img/firefox-settings.png Binary files differ. diff --git a/public/img/floppy-thumb.jpg b/http/public/img/floppy-thumb.jpg Binary files differ. diff --git a/http/public/img/floppy.jpg b/http/public/img/floppy.jpg Binary files differ. diff --git a/http/public/img/giorno-3.png b/http/public/img/giorno-3.png Binary files differ. diff --git a/http/public/img/hacker-quarterly-thumb.jpg b/http/public/img/hacker-quarterly-thumb.jpg Binary files differ. diff --git a/http/public/img/hacker-quarterly.jpg b/http/public/img/hacker-quarterly.jpg Binary files differ. diff --git a/http/public/img/home-directory.png b/http/public/img/home-directory.png Binary files differ. diff --git a/http/public/img/husky-screenshot-thumb.png b/http/public/img/husky-screenshot-thumb.png Binary files differ. diff --git a/http/public/img/husky-screenshot.png b/http/public/img/husky-screenshot.png Binary files differ. diff --git a/http/public/img/keyboard-side-thumb.jpg b/http/public/img/keyboard-side-thumb.jpg Binary files differ. diff --git a/http/public/img/keyboard-side.jpg b/http/public/img/keyboard-side.jpg Binary files differ. diff --git a/http/public/img/keyboard-top-thumb.jpg b/http/public/img/keyboard-top-thumb.jpg Binary files differ. diff --git a/http/public/img/keyboard-top.jpg b/http/public/img/keyboard-top.jpg Binary files differ. diff --git a/http/public/img/laptop-open-with-touchpad-thumb.jpg b/http/public/img/laptop-open-with-touchpad-thumb.jpg Binary files differ. diff --git a/http/public/img/laptop-open-with-touchpad.jpg b/http/public/img/laptop-open-with-touchpad.jpg Binary files differ. diff --git a/http/public/img/laptop-screenshot-old-thumb.png b/http/public/img/laptop-screenshot-old-thumb.png Binary files differ. diff --git a/http/public/img/laptop-screenshot-old.png b/http/public/img/laptop-screenshot-old.png Binary files differ. diff --git a/http/public/img/live-testing-touchpad-thumb.jpg b/http/public/img/live-testing-touchpad-thumb.jpg Binary files differ. diff --git a/http/public/img/live-testing-touchpad.jpg b/http/public/img/live-testing-touchpad.jpg Binary files differ. diff --git a/http/public/img/logo-256.png b/http/public/img/logo-256.png Binary files differ. diff --git a/http/public/img/logo-256x256.png b/http/public/img/logo-256x256.png Binary files differ. diff --git a/http/public/img/logo-ftp.png b/http/public/img/logo-ftp.png Binary files differ. diff --git a/http/public/img/logo-git-256.png b/http/public/img/logo-git-256.png Binary files differ. diff --git a/http/public/img/logo-git.png b/http/public/img/logo-git.png Binary files differ. diff --git a/http/public/img/logo-main-256.png b/http/public/img/logo-main-256.png Binary files differ. diff --git a/http/public/img/logo-main.png b/http/public/img/logo-main.png Binary files differ. diff --git a/http/public/img/logo-mastodon.png b/http/public/img/logo-mastodon.png Binary files differ. diff --git a/http/public/img/logo-matrix.png b/http/public/img/logo-matrix.png Binary files differ. diff --git a/http/public/img/logo-pleroma-128.png b/http/public/img/logo-pleroma-128.png Binary files differ. diff --git a/http/public/img/logo-pleroma-32.png b/http/public/img/logo-pleroma-32.png Binary files differ. diff --git a/http/public/img/logo-pleroma-512.png b/http/public/img/logo-pleroma-512.png Binary files differ. diff --git a/http/public/img/logo-wiki.png b/http/public/img/logo-wiki.png Binary files differ. diff --git a/http/public/img/ls-highlights.png b/http/public/img/ls-highlights.png Binary files differ. diff --git a/http/public/img/ls-no-highlights.png b/http/public/img/ls-no-highlights.png Binary files differ. diff --git a/http/public/img/lwn-homepage-colours.png b/http/public/img/lwn-homepage-colours.png Binary files differ. diff --git a/http/public/img/lwn-we-colours.png b/http/public/img/lwn-we-colours.png Binary files differ. diff --git a/http/public/img/mastodon-error-thumb.png b/http/public/img/mastodon-error-thumb.png Binary files differ. diff --git a/http/public/img/mastodon-error.png b/http/public/img/mastodon-error.png Binary files differ. diff --git a/http/public/img/mastodon-status-announcement.png b/http/public/img/mastodon-status-announcement.png Binary files differ. diff --git a/http/public/img/more-banned-ips.png b/http/public/img/more-banned-ips.png Binary files differ. diff --git a/http/public/img/mx-toolbox-results-thumb.png b/http/public/img/mx-toolbox-results-thumb.png Binary files differ. diff --git a/http/public/img/mx-toolbox-results.png b/http/public/img/mx-toolbox-results.png Binary files differ. diff --git a/http/public/img/neomutt-threading.png b/http/public/img/neomutt-threading.png Binary files differ. diff --git a/http/public/img/neomutt-thumb.png b/http/public/img/neomutt-thumb.png Binary files differ. diff --git a/http/public/img/neomutt.png b/http/public/img/neomutt.png Binary files differ. diff --git a/http/public/img/office-365-spam-thumb.png b/http/public/img/office-365-spam-thumb.png Binary files differ. diff --git a/http/public/img/office-365-spam.png b/http/public/img/office-365-spam.png Binary files differ. diff --git a/http/public/img/old-logo.png b/http/public/img/old-logo.png Binary files differ. diff --git a/http/public/img/paritybit-gopher-lynx-thumb.png b/http/public/img/paritybit-gopher-lynx-thumb.png Binary files differ. diff --git a/http/public/img/paritybit-gopher-lynx.png b/http/public/img/paritybit-gopher-lynx.png Binary files differ. diff --git a/http/public/img/projects/usrmnt/screenshot.png b/http/public/img/projects/usrmnt/screenshot.png Binary files differ. diff --git a/http/public/img/reporting-cisco-error-thumb.png b/http/public/img/reporting-cisco-error-thumb.png Binary files differ. diff --git a/http/public/img/reporting-cisco-error.png b/http/public/img/reporting-cisco-error.png Binary files differ. diff --git a/http/public/img/seo-report.png b/http/public/img/seo-report.png Binary files differ. diff --git a/http/public/img/slack-tracking.png b/http/public/img/slack-tracking.png Binary files differ. diff --git a/http/public/img/st-lynx-thumb.png b/http/public/img/st-lynx-thumb.png Binary files differ. diff --git a/http/public/img/st-lynx.png b/http/public/img/st-lynx.png Binary files differ. diff --git a/http/public/img/st-tc.png b/http/public/img/st-tc.png Binary files differ. diff --git a/http/public/img/st-vim.png b/http/public/img/st-vim.png Binary files differ. diff --git a/http/public/img/syncthing-dashboard-thumb.png b/http/public/img/syncthing-dashboard-thumb.png Binary files differ. diff --git a/http/public/img/syncthing-dashboard.png b/http/public/img/syncthing-dashboard.png Binary files differ. diff --git a/http/public/img/t420s/laptop-looking-good-thumb.jpg b/http/public/img/t420s/laptop-looking-good-thumb.jpg Binary files differ. diff --git a/http/public/img/t420s/laptop-looking-good.jpg b/http/public/img/t420s/laptop-looking-good.jpg Binary files differ. diff --git a/http/public/img/t420s/new-sticker-thumb.jpg b/http/public/img/t420s/new-sticker-thumb.jpg Binary files differ. diff --git a/http/public/img/t420s/new-sticker.jpg b/http/public/img/t420s/new-sticker.jpg Binary files differ. diff --git a/http/public/img/t420s/t420s-close-thumb.jpg b/http/public/img/t420s/t420s-close-thumb.jpg Binary files differ. diff --git a/http/public/img/t420s/t420s-close.jpg b/http/public/img/t420s/t420s-close.jpg Binary files differ. diff --git a/http/public/img/t420s/t420s-thinklight-thumb.jpg b/http/public/img/t420s/t420s-thinklight-thumb.jpg Binary files differ. diff --git a/http/public/img/t420s/t420s-thinklight.jpg b/http/public/img/t420s/t420s-thinklight.jpg Binary files differ. diff --git a/http/public/img/t420s/t420s-trackpad-thumb.jpg b/http/public/img/t420s/t420s-trackpad-thumb.jpg Binary files differ. diff --git a/http/public/img/t420s/t420s-trackpad.jpg b/http/public/img/t420s/t420s-trackpad.jpg Binary files differ. diff --git a/http/public/img/t420s/t420s-wide-thumb.jpg b/http/public/img/t420s/t420s-wide-thumb.jpg Binary files differ. diff --git a/http/public/img/t420s/t420s-wide.jpg b/http/public/img/t420s/t420s-wide.jpg Binary files differ. diff --git a/http/public/img/urxvt-lynx-thumb.png b/http/public/img/urxvt-lynx-thumb.png Binary files differ. diff --git a/http/public/img/urxvt-lynx.png b/http/public/img/urxvt-lynx.png Binary files differ. diff --git a/http/public/img/urxvt-tc.png b/http/public/img/urxvt-tc.png Binary files differ. diff --git a/http/public/img/urxvt-vim.png b/http/public/img/urxvt-vim.png Binary files differ. diff --git a/http/public/img/valid-rss-rogers.png b/http/public/img/valid-rss-rogers.png Binary files differ. diff --git a/http/public/img/vcss.gif b/http/public/img/vcss.gif Binary files differ. diff --git a/http/public/img/vim-airline.gif b/http/public/img/vim-airline.gif Binary files differ. diff --git a/http/public/img/vim-airline.mp4 b/http/public/img/vim-airline.mp4 Binary files differ. diff --git a/http/public/img/vim-no-airline.gif b/http/public/img/vim-no-airline.gif Binary files differ. diff --git a/http/public/img/vim-no-airline.mp4 b/http/public/img/vim-no-airline.mp4 Binary files differ. diff --git a/http/public/js/borderlands-3-dps-calculator.js b/http/public/js/borderlands-3-dps-calculator.js @@ -0,0 +1,151 @@ +"use strict"; +/* + * borderlands-3-dps-calculator.js + * Contains backend code for generation of game parameters + * + * Copyright (C) 2019 Leon Baram, Jake Bauer + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + +/* + * mults_g: + * A dictionary of elemental damage multipliers based on healthbar type. + * Entries are organized in order of "health, shields, armor", + * with first-row entries corresponding to Normal Mode, + * and second-row entries corresponding to True Vault Hunter Mode. + * + * all multiplier values sourced from + * https://borderlands.fandom.com/wiki/Elemental_damage#Borderlands_3 + * in particular, the following table: + * Flesh Shield Armor + Normal TVHM Normal TVHM Normal TVHM +Kinetic 100% 100% 100% 100% 80% 80% +Incendiary 150% 175% 70% 50% 70% 50% +Shock 80% 65% 200% 250% 80% 65% +Corrosive 80% 65% 70% 50% 150% 175% +Cryo 100% 100% 70% 50% 120% 150% +Radiation 100% 100% 100% 150% 70% 50% +*/ +const mults_g = { + None: [ + [1.0, 1.0, 0.8], + [1.0, 1.0, 0.8] + ], + Fire: [ + [1.5, 0.7, 0.7], + [1.75, 0.5, 0.5] + ], + Shock: [ + [0.8, 2.0, 0.8], + [0.65, 2.5, 0.65] + ], + Acid: [ + [0.8, 0.7, 1.5], + [0.65, 0.5, 1.75] + ], + Cryo: [ + [1.0, 0.7, 1.2], + [1.0, 0.5, 1.5] + ], + Rad: [ + [1.0, 1.0, 0.7], + [1.0, 1.5, 0.5] + ] +}; + +/** + * gun properties (except "elmnt" and "tvhm") + */ +const properties_g = [ + "dmg","dmg-mult","rload","frate","mag","ammo" +]; + +/* + * function dps(): + * Preconditions: + * dmg (base gun damage) and mag (magazine size) are positive ints > 0 + * acc (gun accuracy) is a float within [0,100] + * rload (reload time in seconds) and frate (shots fired per second) are positive floats + * element (elemental effect type) is a string + * edmg (elemental effect damage) is a nonnegative int >= 0 + * echance (elemental effect chance) is a float within [0,1] + * TVHM (True Vault Hunter Mode) is a boolean + * + * Postconditions: + * dps is an array of three floats + * dps[0] is average DPS against flesh (red health bar) + * dps[1] is average DPS against shields (blue health bar) + * dps[2] is average DPS against armor (yellow health bar) +*/ +function calculateDPS(gun, effectDuration) { + let dps = []; + + for (let i = 0; i < 3; i++) { + dps[i] = mults_g[gun.elmnt][gun.tvhm][i]; + dps[i] *= (gun["dmg"] * gun["dmg-mult"] * (gun["mag"] / gun ["ammo"])) / + (gun["rload"] + (gun["mag"] / gun["ammo"]) / gun["frate"]); + } + + return dps; +} + +function gamerMoment2() { + + let gun = {}; + let e; + let dpsResult; + let effectDuration; + + for (let str of properties_g) { + gun[str] = parseFloat(document.getElementById(str + "2").value); + if (! gun[str]) + gun[str] = 0; + } + + e = document.getElementById("elmnt2"); + gun["elmnt"] = e.options[e.selectedIndex].value; + gun["tvhm"] = document.getElementById("tvhm2").checked ? 1 : 0; + + dpsResult = calculateDPS(gun, effectDuration); + + document.getElementById("flesh2").innerHTML = dpsResult[0].toFixed(2); + document.getElementById("shields2").innerHTML = dpsResult[1].toFixed(2); + document.getElementById("armour2").innerHTML = dpsResult[2].toFixed(2); +} + +function gamerMoment() { + + let gun = {}; + let e; + let dpsResult; + let effectDuration; + + for (let str of properties_g) { + gun[str] = parseFloat(document.getElementById(str).value); + if (! gun[str]) + gun[str] = 0; + } + + e = document.getElementById("elmnt"); + gun["elmnt"] = e.options[e.selectedIndex].value; + gun["tvhm"] = document.getElementById("tvhm").checked ? 1 : 0; + + dpsResult = calculateDPS(gun, effectDuration); + + document.getElementById("flesh").innerHTML = dpsResult[0].toFixed(2); + document.getElementById("shields").innerHTML = dpsResult[1].toFixed(2); + document.getElementById("armour").innerHTML = dpsResult[2].toFixed(2); + gamerMoment2(); +} diff --git a/http/public/js/generator.js b/http/public/js/generator.js @@ -0,0 +1,79 @@ +/* +* generator.js +* Contains backend code for generation of game parameters +* +* This file is part of MorrowindGameGen +* Copyright (C) 2019 Jake Bauer +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see <https://www.gnu.org/licenses/>. +*/ + +function charGen() { + + const factions = ["Great House Redoran", "Great House Hlaalu", "Great House Telvanni", + "Vampire Clan Aundae", "Vampire Clan Berne", "Vampire Clan Quarra", + "Tribunal Temple", "Imperial Cult", "Sixth House or a Daedra Cult", + "Fighter's Guild", "Mage's Guild", "Thieves Guild", "Blades", + "Morag Tong", "Imperial Legion", "East Empire Company"]; + + const classes = ["Acrobat", "Agent", "Archer", "Assassin", "Barbarian", + "Bard", "Battlemage", "Crusader", "Healer", "Knight", "Mage", "Monk", + "Nightblade", "Pilgrim", "Rogue", "Scout", "Sorcerer", "Spellsword", + "Thief", "Warrior", "Witchhunter"]; + + const hometowns = ["Ald Velothi", "Ald'ruhn", "Balmora", "Caldera", + "Dagon Fel", "Ebonheart", "Gnisis", "Hla Oad", "Khuul", "Maar Gan", + "Molag Mar", "Mournhold", "Pelagiad", "Sadrith Mora", "Seyda Neen", + "Skaal Village", "Suran", "Tel Aruhn", "Tel Branora", "Tel Fyr", + "Tel Mora", "Vivec", "Vos"]; + + const birthsigns = ["Warrior", "Mage", "Thief", "Serpent", "Lady", "Steed", + "Lord", "Apprentice", "Atronach", "Ritual", "Lover", "Shadow", "Tower"]; + + const races = ["Altmer", "Argonian", "Bosmer", "Breton", "Dunmer", + "Imperial", "Khajiit", "Nord", "Orc", "Redguard"]; + + let firstFaction = Math.floor(Math.random() * factions.length); + document.getElementById("factionField1").value = factions[firstFaction]; + document.getElementById("factionField2").value = factions[secondFaction(firstFaction, factions)]; + document.getElementById("classField").value = classes[Math.floor(Math.random()*classes.length)]; + document.getElementById("hometownField").value = hometowns[Math.floor(Math.random()*hometowns.length)]; + document.getElementById("birthsignField").value = birthsigns[Math.floor(Math.random()*birthsigns.length)]; + document.getElementById("raceField").value = races[Math.floor(Math.random()*races.length)]; +} + +function secondFaction(firstFaction, factions){ + let result = firstFaction; + // If the player has already been assigned a great house, choose a non-great + // house faction instead (player cannot be a member of more than one). + if (firstFaction <= 2) + while (result <= 2) + result = Math.floor(Math.random()*factions.length); + // If player is a member of one of the vampire clans, choose another faction + // that isn't a vampire clan (player cannot be a member of more than one). + else if (firstFaction >= 3 && firstFaction <= 5) + while (result >= 3 && result <= 5) + result = Math.floor(Math.random()*factions.length); + // If a player is a member of one of the cults, choose another faction that + // isn't another cult (otherwise it wouldn't make sense roleplay-wise). + else if (firstFaction >= 6 && firstFaction <= 8) + while (result >= 6 && result <= 8) + result = Math.floor(Math.random()*factions.length); + // If none of the above conditions are true, choose any faction other than + // the one already chosen. + else + while (result === firstFaction) + result = Math.floor(Math.random()*factions.length); + return (result); +} diff --git a/http/public/js/initiative.js b/http/public/js/initiative.js @@ -0,0 +1,171 @@ +/*initiative.js +* Copyright (C) 2019 Jake Bauer +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see <https://www.gnu.org/licenses/>. +*/ + +// Global variable keeping track of all characters added to the list. +let charArray = []; + +/* draw() + * @brief Draws a character, their information, and the relevant buttons to the + * viewport. + * @input char The character to draw + * @input position That character's position in the charArray (used to give the + * div a corresponding id attribute); + */ +function draw(char, position) { + let list = document.getElementById("initiative-list"); + let div = document.createElement('div'); + div.setAttribute("class","initiative-div"); + div.setAttribute("id", position); + list.insertBefore(div, list.childNodes[list.childNodes.length-1]); + + let charName = document.createElement('p'); + let textNode = document.createTextNode(char.name); + charName.appendChild(textNode); + charName.setAttribute("class", "in-name"); + div.appendChild(charName); + + let charInit = document.createElement('p'); + textNode = document.createTextNode(char.initiative); + charInit.appendChild(textNode); + charInit.setAttribute("class", "in-val"); + div.appendChild(charInit); + + let editBtn = document.createElement('button'); + let pencil = document.createElement('strong'); + textNode = document.createTextNode("✎"); + pencil.setAttribute("class", "green-pencil"); + pencil.appendChild(textNode); + editBtn.setAttribute("class", "in-edit-btn"); + editBtn.setAttribute("onClick", "editChar(this)"); + div.appendChild(editBtn); + editBtn.appendChild(pencil); + textNode = document.createTextNode(" Edit"); + editBtn.appendChild(textNode); + + let removeBtn = document.createElement('button'); + let x = document.createElement('strong'); + textNode = document.createTextNode("X"); + x.setAttribute("class", "red-x"); + x.appendChild(textNode); + removeBtn.setAttribute("class", "in-rem-btn"); + removeBtn.setAttribute("onClick", "removeChar(this)"); + div.appendChild(removeBtn); + removeBtn.appendChild(x); + textNode = document.createTextNode(" Remove"); + removeBtn.appendChild(textNode); +} + +/* compare() + * @brief Used by sortList() to determine the sorted order. Sorts by greatest to + * least initative value for each character. + * @see sortList() + */ +function compare(a, b) { + if (a.initiative < b.initiative) + return 1; + if (a.initiative > b.initiative) + return -1; + else + return 0; +} + +/* sortList() + * @brief Sort the list of characters by their initative value + * @see compare() + */ +function sortList() { + // Sorts in order largest to smallest + charArray.sort(compare); + // Delete all divs of class initiative-div + for (let i = 0; i < charArray.length; i++) { + let element = document.getElementById(i); + element.parentNode.removeChild(element); + } + // Then re-draw them + for (let i = 0; i < charArray.length; i++) { + draw(charArray[i], i); + } +} + +/* addChar() + * @brief Add a character to the list and sort the list + */ +function addChar() { + let newChar = {}; + nameField = document.getElementById("char-name"); + initField = document.getElementById("init-val"); + newChar.name = nameField.value; + newChar.initiative = Number(initField.value); + nameField.value = null; + initField.value = null; + if (newChar.name == "" || newChar.initiative == null) { + alert("Please fill out both fields before adding a character."); + return; + } + draw(newChar, charArray.length); + charArray.push(newChar); + sortList(); +} + +/* editChar() + * @brief Edit a characters initiative value and re-sort + * @input Elem The "edit" button clicked used to identify which character + * to edit + */ +function editChar(elem) { + let newVal = prompt("Enter the new value:", "0"); + if (newVal != null) { + // Edit the value in the array of characters + let charIndex = elem.parentNode.getAttribute("id"); + charArray[charIndex].initiative = Number(newVal); + // Modify the number displayed for that character + let parentNode = elem.parentNode; + for (let i = 0; i < elem.parentNode.childNodes.length; i++) { + if (parentNode.childNodes[i].className == "in-val") { + parentNode.childNodes[i].innerHTML = newVal; + break; + } + } + sortList(); + } + else { + return; + } +} + +/* removeChar() + * @brief Removes a character from the list of characters + * @input Elem The "remove" button clicked used to identify which character + * to remove + */ +function removeChar(elem) { + let charIndex = elem.parentNode.getAttribute("id"); + for (let i = 0; i < charArray.length; i++) { + if (i == charIndex) { + charArray.splice(i,1); + } + } + // Delete all divs of class initiative-div + for (let i = 0; i <= charArray.length; i++) { + let element = document.getElementById(i); + element.parentNode.removeChild(element); + } + // Then re-draw them + for (let i = 0; i < charArray.length; i++) { + draw(charArray[i], i); + } +} diff --git a/http/public/js/roll.js b/http/public/js/roll.js @@ -0,0 +1,147 @@ +/*roll.js +* Copyright (C) 2019 Jake Bauer +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see <https://www.gnu.org/licenses/>. +*/ + +/* stringRoll() + * @brief This function rolls dice based on the input from the text-field + */ +function stringRoll() { + let rollString = document.getElementById("inputString").value; + let result = 0; + let numRolls, die, operation, modifier, resultStr = ""; + + // Parse values from string + try { + numRolls = rollString.match(/\d+d/ig)[0]; + numRolls = numRolls.substring(0, numRolls.length-1); + die = rollString.match(/d\d+/ig)[0]; + die = die.substring(1); + } + catch(err) { + console.log(err); + alert("Invalid text input! See example for proper string format."); + return; + } + try { + operation = rollString.match(/[\+\-]/ig)[0]; + modifier = rollString.match(/\d+$/ig)[0]; + } + catch(TypeError) { + // Ignore missing operation or modifier strings + } + + // Conduct rolls + for (let i = 0; i < numRolls; i++) { + let intermediate = Math.floor((Math.random()*die)+1); + if (i == numRolls-1) { + // If it's the last roll, don't add a + symbol to the string + resultStr += intermediate; + } + else { + resultStr += intermediate + " + "; + } + result += intermediate; + } + // Finalize the result string + resultStr += " = " + result; + if (numRolls == 1) { + resultStr = result; + } + // Apply the modifier + resultStr = "d"+ die + ": " + resultStr; + if (operation === '-') { + result = Number(result) - Number(modifier); + resultStr += " - " + modifier + " = " + result; + } + else if (operation === '+') { + result = Number(result) + Number(modifier); + resultStr += " + " + modifier + " = " + result; + } + // Add the result to the history box + let hist = document.getElementById("history-text"); + hist.innerHTML = (resultStr + "\n") + hist.innerHTML; +} + +/* roll() + * @brief This function rolls the dice according to which button was pressed + * @input Element The button representing which dice to roll + */ +function roll(element) { + let btnId = (element.id).substring(1); + let numRolls = document.getElementById(('num'+btnId)).value; + let modifier = document.getElementById(('mod'+btnId)).value; + let result = 0; + let resultStr = ""; + // Conduct rolls + for (let i = 0; i < numRolls; i++) { + let intermediate = Math.floor((Math.random()*btnId)+1); + if (i == numRolls-1) { + // If it's the last roll, don't add a + symbol to the string + resultStr += intermediate; + } + else { + resultStr += intermediate + " + "; + } + result += intermediate; + } + // Finalize the result string + resultStr += " = " + result; + if (numRolls == 1) { + resultStr = result; + } + // Apply the modifier + result = Number(result) + Number(modifier); + resultStr = "d"+ btnId + ": " + resultStr; + if (modifier < 0) { + resultStr += " - " + Math.abs(modifier) + " = " + result; + } + else if (modifier > 0) { + resultStr += " + " + modifier + " = " + result; + } + // Show the result as a number in the die's row + document.getElementById(("d"+btnId+"result")).innerHTML = result; + // Add the result to the history box + let hist = document.getElementById("history-text"); + hist.innerHTML = (resultStr + "\n") + hist.innerHTML; +} + +/* clear_history() + * @brief This function clears the history box, restting it back to default + * values while also clearing results and input boxes. + */ +function clear_history() { + let results = document.getElementsByTagName("p"); + for (let i = 0; i < Object.keys(results).length; i++) { + element = results[i]; + if (element.getAttribute("class") == "field") { + element.innerHTML = "0"; + } + } + let inputs = document.getElementsByTagName("input"); + for (let i = 0; i < Object.keys(inputs).length; i++) { + element = inputs[i]; + if (element.getAttribute("type") == "number") { + if (element.getAttribute("min")) { + element.value = 1; + } + else { + element.value = 0; + } + } + } + let hist = document.getElementById("history-text"); + hist.innerHTML = "-------&#13;&#10;History"; +} diff --git a/http/public/js/time-duration-calculator.js b/http/public/js/time-duration-calculator.js @@ -0,0 +1,116 @@ +/* +* time-duration-calculator.js +* +* Copyright (C) 2020 Jake Bauer <jbauer@paritybit.ca> +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see <https://www.gnu.org/licenses/>. +*/ + +startTimeH = 0; +startTimeM = 0; +startTimeS = 0; + +endTimeH = 0; +endTimeM = 0; +endTimeS = 0; + +resultTimeH = 0; +resultTimeM = 0; +resultTimeS = 0; + +totalTimeH = 0; +totalTimeM = 0; +totalTimeS = 0; + +// From: https://gist.github.com/andrewrk/4382935 +function pad_with_zeros(number, size) { + number = number.toString(); + while (number.length < size) number = "0" + number; + return number; +} + +function clear_inputs() { + document.getElementById("start-time-h").value = ""; + document.getElementById("start-time-m").value = ""; + document.getElementById("start-time-s").value = ""; + document.getElementById("end-time-h").value = ""; + document.getElementById("end-time-m").value = ""; + document.getElementById("end-time-s").value = ""; +} + +function get_inputs() { + startTimeH = Number(document.getElementById("start-time-h").value); + startTimeM = Number(document.getElementById("start-time-m").value); + startTimeS = Number(document.getElementById("start-time-s").value); + endTimeH = Number(document.getElementById("end-time-h").value); + endTimeM = Number(document.getElementById("end-time-m").value); + endTimeS = Number(document.getElementById("end-time-s").value); + + if (startTimeH < 0 || startTimeH > 23 || endTimeH < 0 || endTimeH > 23) { + alert("Hours must be between 0 and 23"); + throw "Error: Number out of bounds."; + } + if (startTimeM < 0 || startTimeM > 59 || endTimeM < 0 || endTimeM > 59 + || startTimeS < 0 || startTimeS > 59 || endTimeS < 0 || endTimeS > 59) { + alert("Seconds/Minutes must be between 0 and 59"); + throw "Error: Number out of bounds."; + } +} + +function display_results() { + resultString = pad_with_zeros(resultTimeH, 2) + + "h:" + pad_with_zeros(resultTimeM, 2) + + "m:" + pad_with_zeros(resultTimeS, 2) + "s"; + document.getElementById("result-field").innerHTML = resultString; + document.getElementById("result-field-hours").innerHTML = totalTimeH.toFixed(4); + document.getElementById("result-field-minutes").innerHTML = totalTimeM.toFixed(4); + document.getElementById("result-field-seconds").innerHTML = totalTimeS; +} + +function calculate() { + get_inputs(); + + // Seconds + if (endTimeS < startTimeS) { + resultTimeS = (endTimeS + 60) - startTimeS; + endTimeM--; + } + else { + resultTimeS = endTimeS - startTimeS; + } + + // Minutes + if (endTimeM < startTimeM) { + resultTimeM = (endTimeM + 60) - startTimeM; + endTimeH--; + } + else { + resultTimeM = endTimeM - startTimeM; + } + + // Hours + if (endTimeH < startTimeH) { + resultTimeH = (endTimeH + 24) - startTimeH; + } + else { + resultTimeH = endTimeH - startTimeH; + } + + // Single-unit totals + totalTimeH = resultTimeH + (resultTimeM / 60) + (resultTimeS / 3600); + totalTimeM = (resultTimeH * 60) + resultTimeM + (resultTimeS / 60); + totalTimeS = (resultTimeH * 3600) + (resultTimeM * 60) + resultTimeS; + + display_results(); +} diff --git a/http/public/mstile-144x144.png b/http/public/mstile-144x144.png Binary files differ. diff --git a/http/public/mstile-150x150.png b/http/public/mstile-150x150.png Binary files differ. diff --git a/http/public/mstile-310x150.png b/http/public/mstile-310x150.png Binary files differ. diff --git a/http/public/mstile-310x310.png b/http/public/mstile-310x310.png Binary files differ. diff --git a/http/public/mstile-70x70.png b/http/public/mstile-70x70.png Binary files differ. diff --git a/http/public/robots.txt b/http/public/robots.txt @@ -0,0 +1,3 @@ +Sitemap: https://www.paritybit.ca/sitemap.xml +User-agent: * +Disallow: diff --git a/http/public/safari-pinned-tab.svg b/http/public/safari-pinned-tab.svg @@ -0,0 +1 @@ +<svg version="1" xmlns="http://www.w3.org/2000/svg" width="933.333" height="933.333" viewBox="0 0 700.000000 700.000000"><path d="M327.8.5c-.1.1-4.1.5-8.8.9-8.7.7-10.5.9-22.5 2.7-11.6 1.8-12.3 1.9-19.2 3.5-22.7 5.1-37.3 9.5-55.3 16.6C154.7 50.8 96.6 98 57.5 158c-11.4 17.5-19.8 32.7-26 47-2.1 4.7-4.5 10.3-5.5 12.5-5.6 12.8-15.1 42.7-17.5 55.6-.3 1.3-1.1 5.8-2 9.9-2.9 14.7-3.6 20-5.2 37-1.5 16.4-.8 59.2 1.2 71.1.2 1.3.6 4.6.9 7.4.9 7.8 2.3 15.6 5.1 28.5 3.1 14.2 10.9 39.3 17.5 55.5 4.9 12.3 17.3 37 23.5 46.8 3 4.9 5.5 9.2 5.5 9.7 0 .4.3 1 .8 1.2.4.2 3.3 4.1 6.4 8.8 6.3 9.4 21 28 29 36.6 20.6 22 41.2 39.8 63.8 54.8 17.8 11.7 20.8 13.6 36.5 21.5 33.9 17.3 74 30 109 34.6 2.2.2 5.6.7 7.5 1 18.6 2.6 69.7 2.7 83.7.1 1.7-.3 10.4-1.6 14.8-2.1 6.1-.8 20.6-4 32-7 38.6-10.3 71.3-24.8 103.8-46.3 26.7-17.6 51.1-38.8 70-60.7 3.3-3.9 6.3-7.2 6.7-7.5 1.2-1 13.7-17.6 19.2-25.5 10.7-15.4 23-37.3 30.5-54 6.3-14.1 7.1-16.2 10.6-26 4.6-13.1 7.2-21.5 9.3-29.5 1.5-6.3 1.8-7.4 2.9-12.3 1.4-6 5.5-29.9 6-35.2.4-3.3.9-7.1 1.1-8.5.9-4.7 1.1-52.5.3-60.5-1.5-16.5-2.1-22-2.4-22.5-.2-.3-.6-3-1-6s-2.2-12.3-4-20.5c-5.3-23.2-10.2-38.6-19.7-60.9-39.1-92-116.9-163.5-212.1-195.1-15.6-5.1-41-11.3-53.7-13-1.9-.3-4.6-.7-6-1-1.3-.2-5.2-.7-8.6-1.1-3.3-.3-7.4-.8-9-1-3.2-.5-54-1.4-54.6-.9zm46.7 87c8.1.7 14.6 1.5 17.1 2 1.2.3 3.9.7 6 1.1 3.3.4 8.7 1.7 26.6 5.9 2.5.6 20 6.5 22.3 7.5 1.1.5 4.9 2.1 8.5 3.6 3.6 1.4 11 4.9 16.5 7.7 55.1 28 98.6 74.3 123.8 131.7 8.7 19.7 16.4 48.1 19.1 70.5 2.6 20.3 2.6 48.6.1 66.3-1.2 9.2-1.7 12.3-3.1 19.2-16.5 83.2-73.6 154.6-151.4 189.2-18.8 8.4-43.3 16.3-57 18.3-2.5.4-4.7.8-5 1-1 .6-16.6 2.6-26 3.2-18.6 1.4-43.5.6-58.5-1.6-35-5.4-70.2-17.8-97.3-34.2-3.5-2.1-6.6-3.9-6.9-3.9-.3 0-1.5-.8-2.8-1.8-1.2-.9-3.3-2.4-4.5-3.2-3.9-2.6-13.8-9.8-16.2-11.8-1.3-1.1-4.5-3.9-7.3-6.2-25.6-21.6-49.3-51.6-64.1-81.1C109 460.1 102 444 102.7 444c.3 0 .1-.6-.4-1.3-3-3.6-12-38.4-13.8-52.6-.4-3-.8-6.3-1-7.3-.8-4-1.7-21.2-1.8-32.1 0-14.7.9-26.4 3.4-42.2 1.5-10 1.9-11.5 5.4-25 5.2-19.9 9.3-30.8 19.8-51.7 29.6-59.2 82.2-105.9 145.7-129.3 22.9-8.4 47.5-13.6 71.5-15.1 5.5-.4 10.1-.7 10.2-.9.5-.3 26.7.4 32.8 1z"/><path d="M344.7 157.6c-.1.1-4 .4-8.7.8-11.6.8-17.4 1.6-25 3.2-3.6.8-7.6 1.7-9 2-3 .6-14.7 4.2-17.5 5.4-1.1.5-4.2 1.6-7 2.6-13.4 4.8-35.9 18.1-50.2 29.6-3.9 3.2-7.9 5.8-8.7 5.8-.9 0-1.6.6-1.6 1.3 0 .8-3 4.5-6.6 8.3-28.2 29.4-45.5 63.6-52.6 103.9-3.2 18-3.1 49.8.3 66.8 7.8 39.9 25.3 73.6 53.1 102.1 4.1 4.3 5.8 6.8 5.8 8.7 0 2.2.4 2.6 2.3 2.2 1.6-.3 4.7 1.4 11.1 6.3 47.7 35.9 103.5 48.5 161.2 36.4 8.8-1.9 25.6-6.9 29.9-8.9 1.1-.6 4.3-2 7-3.1 13.5-5.8 28.5-14.7 41.2-24.6 4.5-3.5 8.9-6.4 9.7-6.4.9 0 1.6-.6 1.6-1.3 0-.6 3.4-4.8 7.6-9.1 23.6-24.6 39.3-51.1 48.4-81.9 5.4-18.1 7.5-33.3 7.5-55.2 0-17.7-.5-23.4-3.5-38-6.4-32-19.6-60-40.3-85.3-30.7-37.5-73.5-61.8-122.7-69.6-4.9-.8-32.7-2.5-33.3-2z"/></svg> +\ No newline at end of file diff --git a/http/public/site.webmanifest b/http/public/site.webmanifest @@ -0,0 +1,19 @@ +{ + "name": "", + "short_name": "", + "icons": [ + { + "src": "/android-chrome-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "/android-chrome-512x512.png", + "sizes": "512x512", + "type": "image/png" + } + ], + "theme_color": "#ffffff", + "background_color": "#ffffff", + "display": "standalone" +} diff --git a/http/public/sitemap.xml b/http/public/sitemap.xml @@ -0,0 +1,130 @@ +<?xml version="1.0" encoding="UTF-8"?> +<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> + <url><loc>https://www.paritybit.ca</loc></url> + <url><loc>https://www.paritybit.ca/home</loc></url> + <url><loc>https://www.paritybit.ca/blog</loc></url> + <url><loc>https://www.paritybit.ca/blog/gomux-is-the-best-cli-matrix-client</loc></url> + <url><loc>https://www.paritybit.ca/blog/why-irc-is-still-good</loc></url> + <url><loc>https://www.paritybit.ca/blog/btw-i-use-arch</loc></url> + <url><loc>https://www.paritybit.ca/blog/nope-back-to-st</loc></url> + <url><loc>https://www.paritybit.ca/blog/setting-up-weechat-again</loc></url> + <url><loc>https://www.paritybit.ca/blog/my-top-10-most-used-commands</loc></url> + <url><loc>https://www.paritybit.ca/blog/the-hacker-quarterly-magazine</loc></url> + <url><loc>https://www.paritybit.ca/blog/ethical-investing</loc></url> + <url><loc>https://www.paritybit.ca/blog/choosing-an-investment-brokerage</loc></url> + <url><loc>https://www.paritybit.ca/blog/the-marble-man</loc></url> + <url><loc>https://www.paritybit.ca/blog/my-preferred-fediverse-mobile-client</loc></url> + <url><loc>https://www.paritybit.ca/blog/posting-statuses-on-pleroma-with-a-shell-script</loc></url> + <url><loc>https://www.paritybit.ca/blog/how-to-not-make-an-ass-of-yourself-internet-discussions</loc></url> + <url><loc>https://www.paritybit.ca/blog/gentoo-isnt-for-me</loc></url> + <url><loc>https://www.paritybit.ca/blog/adding-image-optimization-to-my-static-site-generator</loc></url> + <url><loc>https://www.paritybit.ca/blog/use-xterm-256color-with-alacritty</loc></url> + <url><loc>https://www.paritybit.ca/blog/my-journey-with-computers</loc></url> + <url><loc>https://www.paritybit.ca/blog/vortex-vibe-keyboard</loc></url> + <url><loc>https://www.paritybit.ca/blog/my-git-server-was-ddosed</loc></url> + <url><loc>https://www.paritybit.ca/blog/mastodon-to-pleroma-3-shutting-down-mastodon</loc></url> + <url><loc>https://www.paritybit.ca/blog/i-was-wrong</loc></url> + <url><loc>https://www.paritybit.ca/blog/switching-to-alacritty</loc></url> + <url><loc>https://www.paritybit.ca/blog/two-truths-and-a-lie</loc></url> + <url><loc>https://www.paritybit.ca/blog/mastodon-to-pleroma-2-customizing-my-instance</loc></url> + <url><loc>https://www.paritybit.ca/blog/mastodon-to-pleroma-1-setting-up-a-pleroma-server</loc></url> + <url><loc>https://www.paritybit.ca/blog/two-months-with-aerc</loc></url> + <url><loc>https://www.paritybit.ca/blog/my-attempts-to-fix-my-mastodon-instance</loc></url> + <url><loc>https://www.paritybit.ca/blog/why-i-hate-the-term-modern</loc></url> + <url><loc>https://www.paritybit.ca/blog/be-a-good-netizen</loc></url> + <url><loc>https://www.paritybit.ca/blog/debian-with-btrfs</loc></url> + <url><loc>https://www.paritybit.ca/blog/using-rm-with-trash</loc></url> + <url><loc>https://www.paritybit.ca/blog/new-desktop-checklist</loc></url> + <url><loc>https://www.paritybit.ca/blog/new-server-checklist</loc></url> + <url><loc>https://www.paritybit.ca/blog/machine-hostnames</loc></url> + <url><loc>https://www.paritybit.ca/blog/colours-for-gitea-issues</loc></url> + <url><loc>https://www.paritybit.ca/blog/migrating-my-wiki-off-of-mediawiki</loc></url> + <url><loc>https://www.paritybit.ca/blog/my-todo-solution</loc></url> + <url><loc>https://www.paritybit.ca/blog/are-todo-applications-a-waste-of-time</loc></url> + <url><loc>https://www.paritybit.ca/blog/improving-blog-searching</loc></url> + <url><loc>https://www.paritybit.ca/blog/switching-to-cgit</loc></url> + <url><loc>https://www.paritybit.ca/blog/generating-my-geek-code</loc></url> + <url><loc>https://www.paritybit.ca/blog/adding-search-to-my-blog</loc></url> + <url><loc>https://www.paritybit.ca/blog/a-month-and-a-half-of-self-hosted-email</loc></url> + <url><loc>https://www.paritybit.ca/blog/how-i-keep-my-home-directory-clean</loc></url> + <url><loc>https://www.paritybit.ca/blog/my-first-ctf</loc></url> + <url><loc>https://www.paritybit.ca/blog/use-syncthing-to-sync-things</loc></url> + <url><loc>https://www.paritybit.ca/blog/why-dwm-swallowing-cant-swallow-tmux</loc></url> + <url><loc>https://www.paritybit.ca/blog/switching-to-debian-sid</loc></url> + <url><loc>https://www.paritybit.ca/blog/my-lwn-theme</loc></url> + <url><loc>https://www.paritybit.ca/blog/reflecting-on-50-days-of-blogging</loc></url> + <url><loc>https://www.paritybit.ca/blog/how-to-create-an-rss-feed-for-your-blog-3</loc></url> + <url><loc>https://www.paritybit.ca/blog/how-to-create-an-rss-feed-for-your-blog-2</loc></url> + <url><loc>https://www.paritybit.ca/blog/how-to-create-an-rss-feed-for-your-blog-1</loc></url> + <url><loc>https://www.paritybit.ca/blog/my-beginnings-with-gentoo</loc></url> + <url><loc>https://www.paritybit.ca/blog/my-new-t420s</loc></url> + <url><loc>https://www.paritybit.ca/blog/announcing-kontaktb</loc></url> + <url><loc>https://www.paritybit.ca/blog/how-i-manage-my-dotfiles</loc></url> + <url><loc>https://www.paritybit.ca/blog/making-my-site-easier-to-read</loc></url> + <url><loc>https://www.paritybit.ca/blog/improving-my-blog-post-publishing-script</loc></url> + <url><loc>https://www.paritybit.ca/blog/trying-out-dwm</loc></url> + <url><loc>https://www.paritybit.ca/blog/setting-up-a-status-page</loc></url> + <url><loc>https://www.paritybit.ca/blog/scripting-my-way-to-success</loc></url> + <url><loc>https://www.paritybit.ca/blog/curating-my-blogroll</loc></url> + <url><loc>https://www.paritybit.ca/blog/why-email-is-the-best-discussion-platform</loc></url> + <url><loc>https://www.paritybit.ca/blog/toggling-between-indentation-styles-in-vim</loc></url> + <url><loc>https://www.paritybit.ca/blog/dnd-xp-system</loc></url> + <url><loc>https://www.paritybit.ca/blog/it-doesnt-have-to-be-perfect</loc></url> + <url><loc>https://www.paritybit.ca/blog/book-review-the-mediocre-programmer</loc></url> + <url><loc>https://www.paritybit.ca/blog/a-quick-rant-about-web-font-sizes</loc></url> + <url><loc>https://www.paritybit.ca/blog/i-like-perl</loc></url> + <url><loc>https://www.paritybit.ca/blog/choosing-a-self-hosted-git-service</loc></url> + <url><loc>https://www.paritybit.ca/blog/going-from-user-to-contributor-with-foss</loc></url> + <url><loc>https://www.paritybit.ca/blog/paying-for-software</loc></url> + <url><loc>https://www.paritybit.ca/blog/two-of-the-most-valuable-lessons-ive-learned</loc></url> + <url><loc>https://www.paritybit.ca/blog/rewriting-my-static-site-generator</loc></url> + <url><loc>https://www.paritybit.ca/blog/self-hosted-mail-now-live</loc></url> + <url><loc>https://www.paritybit.ca/blog/attempting-to-replace-my-thinkpads-touchpad</loc></url> + <url><loc>https://www.paritybit.ca/blog/trying-out-aerc</loc></url> + <url><loc>https://www.paritybit.ca/blog/setting-up-gpg-keys-from-scratch</loc></url> + <url><loc>https://www.paritybit.ca/blog/self-hosting-email</loc></url> + <url><loc>https://www.paritybit.ca/blog/preparing-to-self-host-email</loc></url> + <url><loc>https://www.paritybit.ca/blog/diving-deeper-into-the-small-internet</loc></url> + <url><loc>https://www.paritybit.ca/blog/setting-up-a-gopher-site</loc></url> + <url><loc>https://www.paritybit.ca/blog/a-brief-review-of-fedora-32</loc></url> + <url><loc>https://www.paritybit.ca/blog/why-i-love-the-fediverse</loc></url> + <url><loc>https://www.paritybit.ca/blog/submitting-a-bug-report-to-freebsd</loc></url> + <url><loc>https://www.paritybit.ca/blog/cat-v-considered-harmful</loc></url> + <url><loc>https://www.paritybit.ca/blog/unsure-what-to-write</loc></url> + <url><loc>https://www.paritybit.ca/blog/the-joys-of-old-tech</loc></url> + <url><loc>https://www.paritybit.ca/blog/refining-my-neomutt-config</loc></url> + <url><loc>https://www.paritybit.ca/blog/clone-wars-finale</loc></url> + <url><loc>https://www.paritybit.ca/blog/the-diefenbunker-museum</loc></url> + <url><loc>https://www.paritybit.ca/blog/the-disappearance-of-one</loc></url> + <url><loc>https://www.paritybit.ca/blog/caring-about-seo</loc></url> + <url><loc>https://www.paritybit.ca/blog/i-got-more-ram</loc></url> + <url><loc>https://www.paritybit.ca/blog/interesting-things-for-today</loc></url> + <url><loc>https://www.paritybit.ca/blog/how-far-translation-tools-have-come</loc></url> + <url><loc>https://www.paritybit.ca/blog/tweaking-some-css</loc></url> + <url><loc>https://www.paritybit.ca/blog/how-much-ram-is-enough</loc></url> + <url><loc>https://www.paritybit.ca/blog/why-i-blog</loc></url> + <url><loc>https://www.paritybit.ca/blog/decommissioning-my-rackmount-server</loc></url> + <url><loc>https://www.paritybit.ca/blog/housecleaning</loc></url> + <url><loc>https://www.paritybit.ca/blog/logo-redesign</loc></url> + <url><loc>https://www.paritybit.ca/blog/making-my-own-vim-statusline</loc></url> + <url><loc>https://www.paritybit.ca/blog/urxvt-to-st</loc></url> + <url><loc>https://www.paritybit.ca/blog/website-redesign</loc></url> + <url><loc>https://www.paritybit.ca/blog/automating-publishing</loc></url> + <url><loc>https://www.paritybit.ca/blog/arguing-effectively</loc></url> + <url><loc>https://www.paritybit.ca/blog/difficulty-of-privacy-education</loc></url> + <url><loc>https://www.paritybit.ca/blog/qutebrowser-to-firefox</loc></url> + <url><loc>https://www.paritybit.ca/blog/china</loc></url> + <url><loc>https://www.paritybit.ca/links</loc></url> + <url><loc>https://www.paritybit.ca/projects</loc></url> + <url><loc>https://www.paritybit.ca/projects/borderlands-3-dps-calculator</loc></url> + <url><loc>https://www.paritybit.ca/projects/usrmnt</loc></url> + <url><loc>https://www.paritybit.ca/projects/morrowind-character-roller</loc></url> + <url><loc>https://www.paritybit.ca/projects/dnd/roll</loc></url> + <url><loc>https://www.paritybit.ca/projects/dnd/initiative</loc></url> + <url><loc>https://www.paritybit.ca/about</loc></url> + <url><loc>https://www.paritybit.ca/now</loc></url> + <url><loc>https://www.paritybit.ca/contact</loc></url> + <url><loc>https://www.paritybit.ca/uses</loc></url> + <url><loc>https://www.paritybit.ca/about-site</loc></url> + <url><loc>https://www.paritybit.ca/feeds/sitewide-feed.xml</loc></url> +</urlset> diff --git a/http/public/vid/noswallow-animated-thumb.webm b/http/public/vid/noswallow-animated-thumb.webm Binary files differ. diff --git a/http/public/vid/noswallow-animated.webm b/http/public/vid/noswallow-animated.webm Binary files differ. diff --git a/http/public/vid/swallow-animated-thumb.webm b/http/public/vid/swallow-animated-thumb.webm Binary files differ. diff --git a/http/public/vid/swallow-animated.webm b/http/public/vid/swallow-animated.webm Binary files differ. diff --git a/http/publish b/http/publish @@ -0,0 +1,265 @@ +#!/bin/sh + +# publish +# +# Copyright (C) 2019,2020 Jake Bauer +# +# A utility to publish blog posts to paritybit.ca. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see \<https://www.gnu.org/licenses/\>. + +# POSIX Shell "Strict Mode" +set -o errexit +set -o nounset +IFS=$(printf '\n\t') + +if [ ! -x "$(command -v rsync)" ]; then + echo "rsync is needed but was not found." + exit 1 +fi +if [ -x "$(command -v nvim)" ]; then + vim_ver="nvim" +elif [ ! -x "$(command -v vim)" ]; then + vim_ver="vim" +else + echo "Either vim or nvim is needed but was not found." + exit 1 +fi +if [ -z "$1" ]; then + echo "No arguments given; nothing to do." + exit 1 +fi + +# Define colours +CLEAR="\033[0m" +RED="\033[0;31m" +GREEN="\033[0;32m" +YELLOW="\033[0;33m" + +# The RSS feed to edit +mainFeed="public/feeds/sitewide-feed.xml" +# Where to upload files +remote="paritybit.ca:uploads/" +# The main base page on the site +baseURL="https://www.paritybit.ca/blog" +# Name of the base page +basePage="blog" +# The path to the compiled base page +categoryPage="html/blog.html" +# Set to false to disable auto uploading files +autoUpload="true" +# Set to false to disable auto posting statuses on Mastodon +autoPost="true" +# Social media API endpoint +socialMediaURL="https://pleroma.paritybit.ca/api/v1/statuses" +# Social media API access token +accessToken="" + +# Prints the message passed as the 1st argument in red. +print_error_msg() +{ + printf "$RED[ee] %s\n$CLEAR" "$1" +} + +# Prints the message passed as the 1st argument in green. +print_success_msg() +{ + printf "$GREEN[ok] %s\n$CLEAR" "$1" +} + +# Prints the message passed as the 1st argument in yellow. +print_header_msg() +{ + printf "$YELLOW[hh] %s\n$CLEAR" "$1" +} + +# Prints the message passed as the 1st argument with default colours. +print_info_msg() +{ + printf "$CLEAR[ii] %s\n" "$1" +} + +# Populate the [DATE] fields of the blog post +populate_date() +{ + print_info_msg "Populating [DATE] fields" + sed -i -e "s/\[DATE\]/$shortDate/g" "$file" + ./compile -n "$file" +} + +# Update the main blog list page +update_base_page() +{ + print_info_msg "Updating base page" + awk -v pt="$pageTitle" -v bp="$basePage" -v f="$fileName" -v d="$shortDate" \ + '{print} /^<ul>/ && !n {print " <li>"d" <a href=\""bp"/"f"\">"pt"</a></li>"; n++}' \ + pages/"$basePage".md > tmp.md && mv tmp.md pages/"$basePage".md + ./compile -n pages/$basePage.md +} + + +# Update the home page to show the new published article and remove oldest entry +update_home_page() +{ + print_info_msg "Updating home page" + sed -i -e "/<\/div>/a\\ +$shortDate \<a class=\"feed-item\" href=\"$basePage\/$fileName\"\>$pageTitle\<\/a\>\n" \ + pages/home.md + echo "/### What is a Parity Bit + 2k2dd + :wq" > /tmp/script.vim + "$vim_ver" -s /tmp/script.vim pages/home.md + ./compile -s -n pages/home.md +} + +create_rss_entry() +{ + print_info_msg "Creating RSS entry" + + # Opening tag + rssEntry="${rssEntry}<item>" + + # Set <title> + rssEntry="${rssEntry} + <title>$pageTitle</title>" + + # Set <link> and <guid> + rssEntry="${rssEntry} + <link>$baseURL/$fileName</link>" + rssEntry="${rssEntry} + <guid>$baseURL/$fileName</guid>" + + # Set pubDate + rssEntry="${rssEntry} + <pubDate>$date</pubDate>" + + # Fill out content + pageContent=$(cat build/blog/"$fileName"-content.html) + rssEntry="${rssEntry} + <description><![CDATA[$pageContent]]></description>" + + # Close the entry + rssEntry="${rssEntry} + </item>" +} + +update_rss_feed() +{ + print_info_msg "Updating RSS feed" + mv "$mainFeed" "$mainFeed.bak" + head -n 8 "$mainFeed.bak" > "$mainFeed" + echo "$rssEntry" >> "$mainFeed" + tail -n +9 "$mainFeed.bak" >> "$mainFeed" +} + +update_sitemap() +{ + print_info_msg "Updating sitemap" + echo "$baseURL" > /tmp/base-url.txt + sed -i -e 's/\//\\\//g' /tmp/base-url.txt + baseURLClean=$(cat /tmp/base-url.txt) + sed -i -e "/$baseURLClean</a\\ + <url\>\<loc\>$baseURLClean\/$fileName\<\/loc\>\<\/url\>" \ + public/sitemap.xml +} + +# Upload the new feed plus the new article and updated pages to the website +auto_upload() +{ + if [ "$autoUpload" != "true" ]; then + return 0 + fi + print_info_msg "Auto-uploading files" + cd public && rsync -rR html/home.html sitemap.xml feeds/sitewide-feed.xml \ + "$categoryPage" "$article" "$remote" && cd .. +} + +# Post a status update on Pleroma linking to the new blog post +auto_post() +{ + if [ "$autoPost" != "true" ]; then + return 0 + fi + + print_info_msg "Generating social media post" + meta="$(head -n3 "$file" | tail -n1 \ + | cut -d'#' -f2 | sed -e 's/^[[:space:]]*//')" + printf "New Blog Post: %s\n\n%s/%s\n\n%s\n\n#100DaysToOffload" \ + "$pageTitle" "$baseURL" "$fileName" "$meta" > /tmp/status.txt + uniqueId="$(md5sum /tmp/status.txt | awk '{print $1}')" + + echo "" + cat /tmp/status.txt + echo "" + + resp="$(curl -s -S -i -X POST \ + -H "Idempotency-Key: $uniqueId" \ + -H "Authorization: Bearer $accessToken" \ + -F status="$(cat /tmp/status.txt)" \ + -F visibility=public \ + "$socialMediaURL")" + httpCode="$(echo "$resp" | grep HTTP/ | awk '{print $2}')" + + if [ "$httpCode" = "200" ]; then + print_success_msg "Successfully posted status update" + else + print_error_msg "ERROR: Failed to post status update" + echo "$resp" + fi +} + +for file in "$@"; do + if [ ! -f "$file" ]; then + print_error_msg "ERROR: File $file not found or is not a file." + continue + fi + + date=$(date +"%a, %d %b %Y %T %z") + shortDate=$(date +"%F") + fileName=$(basename -s .md -- "$file") + pageTitle=$(head -n 1 "$file" | cut -d' ' -f2-) + article="html/blog/$fileName.html" + rssEntry="" + + print_header_msg "PUBLISHING: $file" + + # Thanks to: https://stackoverflow.com/a/27875395/12865517 + printf "Are you sure you wish to publish this post? [y/N]: " + old_stty_cfg=$(stty -g) + stty raw -echo + answer=$( while ! head -c 1 | grep -i '[ny]' ;do true ;done ) + stty "$old_stty_cfg" + if echo "$answer" | grep -iq "^y" ;then + echo "" + print_success_msg "Publishing..." + else + echo "" + print_error_msg "Refusing to publish" + continue + fi + + populate_date + update_base_page + update_home_page + create_rss_entry + update_rss_feed + update_sitemap + auto_upload + auto_post + + print_success_msg "PUBLISHED: $file" + print_success_msg "Visit: $baseURL/$fileName.html" + +done + diff --git a/http/style/borderlands.css b/http/style/borderlands.css @@ -0,0 +1,51 @@ +input:not(#tvhm):not(#tvhm2) { + width: 100px; +} + +select { + width: 106px; +} + +.td-label { + text-align: right; + padding-right: 10px; +} + +#grid-container { + display: grid; + grid-gap: 1em; + grid-template-columns: auto auto; + justify-content: center; + align-content: center; +} + +#form-1 { + grid-column: 1; + grid-row: 1; +} + +#form-2 { + grid-column: 2; + grid-row: 1; +} + +#results-1 { + grid-column: 1; + grid-row: 3; +} + +#results-2 { + grid-column: 2; + grid-row: 3; +} + +#calc-button { + grid-column: 1 / span 2; + grid-row: 2; + width: 50%; + margin-left: 25%; +} + +#flesh, #shields, #armour, #flesh2, #shields2, #armour2 { + margin: 0px; +} diff --git a/http/style/initiative.css b/http/style/initiative.css @@ -0,0 +1,53 @@ +.initiative-list { + width: 100%; + padding: 1em 0 1em 0; +} + +.initiative-div { + border-radius: 20px; + background-color: var(--input-bg); + margin-bottom: 0.5em; +} + +.initiative-div > * { + display: inline-block; +} + +.in-name { + font-weight: bold; + width: 50%; + padding-left: 1em; +} + +.in-val { + margin-right: 1em; + text-align: center; + font-weight: bold; + width: 10%; +} + +.in-rem-btn, .in-edit-btn { + border-radius: 30px; + margin-right: 2em; +} + +.red-x { + color: var(--unvis-link); +} + +.green-pencil { + color: var(--vis-link); +} + +#add-char > * { + display: inline-block; +} + +@media only screen and (max-width: 750px) { + .in-edit-btn { + margin: 1em 1em 1em 4em; + } + .in-rem-btn { + margin: 1em; + } +} diff --git a/http/style/main.css b/http/style/main.css @@ -0,0 +1,293 @@ +:root { + --bg: #25252a; + --fg: #cccccc; + --bg-bright: #36363a; + --fg-bright: #eaeaea; + --fg-dim: #8c8c8c; + --code: #4c4c4c; + --accent: #83b3d8; + --vis-link: #A696CC; + --hov-link: #80ccff; + --notice-bg: #224499; + --border-dark: #585858; + --font-size: 100%; + --small-font: 0.8rem; + --large-font: 1.1rem; + --line-height: 1.3rem; +} + +html { + scrollbar-color: var(--accent) transparent; +} + +body { + background-color: var(--bg); + color: var(--fg); + font-family: "DejaVu Sans", "Open Sans", "Noto Sans", "Roboto", "Droid Sans", sans-serif; + font-size: var(--font-size); + line-height: var(--line-height); + max-width: 40rem; + margin: auto; + padding: 0rem 0.7rem; +} + +h3, h4, h5, h6 { + margin: 2em 0 1em 0; +} + +h2 { + font-style: oblique; + margin-bottom: 0.1em; + line-height: 1.1em; +} + +nav { + text-align: center; +} + +nav a { + padding: 0em 0.5em; + font-size: var(--large-font); + font-weight: bold; + text-decoration: none; +} + +a, nav a:visited { + color: var(--accent); +} + +a:hover, li a:hover, .feed-item:hover, nav a:hover { + color: var(--hov-link) !important; + text-decoration: underline; +} + +a:visited { + color: var(--vis-link); +} + +a:hover { + text-decoration: none; +} + +li a, .feed-item { + text-decoration: none; + font-weight: bold; +} + +s { + color: var(--fg-dim); +} + +img, video { + max-width: 100%; +} + +blockquote { + border-left: 5px solid var(--accent); + border-radius: 10px; + padding-left: 0.5em; +} + +figure { + text-align: center; +} + +figcaption { + margin-bottom: 1.5em; +} + +select, input { + color: var(--fg-bright); + background-color: var(--bg-bright); + border: 2px solid var(--border-dark); + border-radius: 5px; + padding: 0.2em; +} + +select:focus, input:focus { + border: 2px solid var(--accent); +} + +button { + color: var(--fg-bright); + background-color: var(--code); + border: 2px outset var(--border-dark); + border-radius: 5px; + padding: 3px 8px; +} + +button:hover { + border: 2px outset var(--accent); +} + +button:active { + border: 2px inset var(--border-dark); +} + +table, th, td { + border: 2px solid var(--border-dark); + border-collapse: collapse; + text-align: left; + padding: 0.25em 0.5em; +} + +th { + color: var(--fg-bright); + background-color: var(--bg-bright); +} + +.badge { + display: inline-block; + margin: 5px; +} + +.byline { + font-size: var(--small-font); +} + +.eff-banner { + float: right; + width: 75px; + height: 75px; +} + +.debian-banner { + float: left; + width: 68px; + height: 85px; +} + +.rss-icon { + display: inline-block; + margin-left: 0.5em; +} + +.rss-icon img { + width: 1rem; + height: 1rem; +} + +.feed-wrapper { + margin-bottom: -1em; +} + +.feed-title { + display: inline-block; +} + +.note { + background-color: var(--notice-bg); + color: var(--fg-bright); + border-radius: 5px; + box-shadow: 4px 4px 5px 0px rgba(0,0,0,0.5); + padding: 20px 30px; + margin: auto; +} + +.note a, .note a:visited{ + color: var(--fg-bright); + text-decoration: underline; +} + +#header { + text-align: center; + clear: both; + margin: 1em auto; + font-size: var(--large-font); +} + +#table-of-contents { + float: right; + margin: 0em 0em 1em 1em; + width: 45%; + border: 2px var(--border-dark) solid; + border-radius: 5px; + background-color: var(--bg-bright); +} + +#toc-title { + font-size: var(--large-font); + font-weight: bold; + padding-left: 1em; +} + +#footer { + clear: both; +} + +#footer > p { + text-align: center; + font-size: var(--small-font); + padding: 0em 6em; +} + +@media print { + body { + font-size: 16px; + } + pre { + white-space: pre-wrap; + } +} +@media only screen and (max-width: 600px) { + #table-of-contents { + width: 70%; + float: none; + margin: auto; + margin-top: 1.5em; + } +} + +/* Syntax highlighting */ +pre { + background-color: var(--code); + overflow: auto; + padding: 1em; + border: 2px var(--border-dark) solid; + border-radius: 5px; + text-indent: -0.25em; /*Needed otherwise first line indented for some reason*/ +} + +code { + font-family: "DejaVu Sans Mono", monospace; + background-color: var(--code); + color: var(--fg-bright); + font-size: var(--small-font); + padding: 1px 4px; + border-radius: 5px; +} + +code a, code a:hover { + color: var(--fg-bright) !important; +} + +/* Colours taken from pandoc .theme files with extra tweaks */ +code span.al { color: #fba5a2; } /* Alert */ +code span.an { color: var(--fg); font-weight: bold; } /* Annotation */ +code span.at { color: var(--fg-bright); } /* Attribute */ +code span.bn { color: #beb8d5; } /* BaseN */ +code span.bu { color: #bac17c; } /* BuiltIn */ +code span.cf { color: #9dbfe4; } /* ControlFlow */ +code span.ch { color: #beb8d5; } /* Char */ +code span.cn { color: #beb8d5; font-weight: bold; } /* Constant */ +code span.co { color: var(--fg); font-style: italic; } /* Comment */ +code span.cv { color: var(--fg); font-weight: bold; font-style: italic; } /* CommentVar */ +code span.do { color: var(--fg); font-style: italic; } /* Documentation */ +code span.dt { color: #e4b285; } /* DataType */ +code span.dv { color: #beb8d5; } /* DecVal */ +code span.er { color: #fba5a2; } /* Error */ +code span.ex { color: #bac17c; } /* Extension */ +code span.fl { color: #beb8d5; } /* Float */ +code span.fu { color: #e4b285; } /* Function */ +code span.im { color: var(--fg-bright); } /* Import */ +code span.in { color: var(--fg); font-weight: bold; } /* Information */ +code span.kw { color: #9dbfe4; font-weight: bold; } /* Keyword */ +code span.op { color: var(--fg-bright); } /* Operator */ +code span.ot { color: #9dbfe4; } /* Other */ +code span.pp { color: #bac17c; font-weight: bold; } /* Preprocessor */ +code span.sc { color: #e4b285; } /* SpecialChar */ +code span.ss { color: #88c6cd; } /* SpecialString */ +code span.st { color: #88c6cd; } /* String */ +code span.va { color: #bac17c; } /* Variable */ +code span.vs { color: #88c6cd; } /* VerbatimString */ +code span.wa { color: var(--fg); font-weight: bold; } /* Warning */ diff --git a/http/style/morrowind.css b/http/style/morrowind.css @@ -0,0 +1,94 @@ +#grid-container { + display: grid; + grid-template-columns: auto auto; + justify-content: center; + align-content: center; +} + +#lfn { + grid-column: 1; + grid-row: 1; + margin: 0; +} + +#lff1 { + grid-column: 1; + grid-row: 2; +} + +#lff2 { + grid-column: 1; + grid-row: 3; +} + +#lcf { + grid-column: 1; + grid-row: 4; +} + +#lhf { + grid-column: 1; + grid-row: 5; +} + +#lbf { + grid-column: 1; + grid-row: 6; +} + +#lrf { + grid-column: 1; + grid-row: 7; +} + +#genButton { + grid-column: 2; + grid-row: 8; + margin-top: 0.5em; +} + +#afn { + grid-column: 2; + grid-row: 1; +} + +#factionField1 { + grid-column: 2; + grid-row: 2; +} + +#factionField2 { + grid-column: 2; + grid-row: 3; +} + +#classField { + grid-column: 2; + grid-row: 4; +} + +#hometownField { + grid-column: 2; + grid-row: 5; +} + +#birthsignField { + grid-column: 2; + grid-row: 6; +} + +#raceField { + grid-column: 2; + grid-row: 7; +} + +.fieldTitle { + font-weight: bold; + padding: 0 1em 0 0; + text-align: right; + margin-top: 0.2em; +} + +.charField { + width: 16em; +} diff --git a/http/style/roll.css b/http/style/roll.css @@ -0,0 +1,207 @@ +input:not(#inputString) { + width: 4em; +} + +.field { + font-weight: bold; + margin: 0 0 0 0.8em; + padding-top: 0.3em; +} + +#grid-container { + display: grid; + grid-template-columns: auto auto auto auto auto; + justify-content: left; + grid-gap: 0.2em; +} + +#history { + position: relative; + grid-column: 5; + grid-row: 2 / span 7; +} + +#history-text { + display: inline-block; + margin: 1em; + float: left; + width: 100%; + color: var(--fg-alt); + background-color: var(--bg-alt); +} + +#clear-history { + position: absolute; + margin-left: 1em; + margin-bottom: 1em; + bottom: 1px; + left: 1px; +} + +#die-header { + grid-column: 1; + grid-row: 1; +} + +#num-header { + grid-column: 2; + grid-row: 1; +} + +#mod-header { + grid-column: 3; + grid-row: 1; +} + +#res-header { + grid-column: 4; + grid-row: 1; +} + +#d4 { + grid-column: 1; + grid-row: 2; +} + +#d6 { + grid-column: 1; + grid-row: 3; +} + +#d8 { + grid-column: 1; + grid-row: 4; +} + +#d10 { + grid-column: 1; + grid-row: 5; +} + +#d12 { + grid-column: 1; + grid-row: 6; +} + +#d20 { + grid-column: 1; + grid-row: 7; +} + +#d100 { + grid-column: 1; + grid-row: 8; +} + +#num4 { + grid-column: 2; + grid-row: 2; +} + +#num6 { + grid-column: 2; + grid-row: 3; +} + +#num8 { + grid-column: 2; + grid-row: 4; +} + +#num10 { + grid-column: 2; + grid-row: 5; +} + +#num12 { + grid-column: 2; + grid-row: 6; +} + +#num20 { + grid-column: 2; + grid-row: 7; +} + +#num100 { + grid-column: 2; + grid-row: 8; +} + +#mod4 { + grid-column: 3; + grid-row: 2; +} + +#mod6 { + grid-column: 3; + grid-row: 3; +} + +#mod8 { + grid-column: 3; + grid-row: 4; +} + +#mod10 { + grid-column: 3; + grid-row: 5; +} + +#mod12 { + grid-column: 3; + grid-row: 6; +} + +#mod20 { + grid-column: 3; + grid-row: 7; +} + +#mod100 { + grid-column: 3; + grid-row: 8; +} + +#d4result { + grid-column: 4; + grid-row: 2; +} + +#d6result { + grid-column: 4; + grid-row: 3; +} + +#d8result { + grid-column: 4; + grid-row: 4; +} + +#d10result { + grid-column: 4; + grid-row: 5; +} + +#d12result { + grid-column: 4; + grid-row: 6; +} + +#d20result { + grid-column: 4; + grid-row: 7; +} + +#d100result { + grid-column: 4; + grid-row: 8; +} + +@media only screen and (max-width: 680px) { + #history { + position: relative; + grid-column: 1 / span 4; + grid-row: 9; + } +} diff --git a/http/style/tdc.css b/http/style/tdc.css @@ -0,0 +1,66 @@ +input { + max-width: 4em; + margin-bottom: 0.5em; +} + +button { + margin-top: 0.5em; +} + +#grid-container p { + margin: 0; +} + +#grid-container { + display: grid; + grid-gap: 1em; + grid-template-columns: 5em auto; + margin-top: 1em; +} + +#duration-label, +#hours-label, +#minutes-label, +#seconds-label { + grid-column: 1; + text-align: right; +} + +#duration-label { + grid-row: 1; +} + +#hours-label { + grid-row: 2; +} + +#minutes-label { + grid-row: 3; +} + +#seconds-label { + grid-row: 4; +} + +#result-field, +#result-field-hours, +#result-field-minutes, +#result-field-seconds { + grid-column: 2; +} + +#result-field { + grid-row: 1; +} + +#result-field-hours { + grid-row: 2; +} + +#result-field-minutes { + grid-row: 3; +} + +#result-field-seconds { + grid-row: 4; +} diff --git a/http/tuptime-update.pl b/http/tuptime-update.pl @@ -0,0 +1,61 @@ +#!/bin/perl + +use strict; +use warnings; +use HTML::TreeBuilder; +use File::Copy qw(copy move); + +# Copy about-site file so we can work on it without disturbing live copy +copy '/var/www/html/about-site.html', './about-site.html'; +my $outfile = './about-site.html.new'; +my $infile = './about-site.html'; + +# Open both infile and outfile for reading/writing respectively +open(my $fh, '<:encoding(UTF-8)', $infile) + or die "Could not open file '$infile' $!"; +open my $out, '>', "$outfile" or die "Can't write new file: $!"; + +# Run the tuptime command to get output for putting into outfile +my $cmd = "tuptime"; +my @output = `$cmd`; +chomp @output; + +# Look through each line of the infile, write the line to outfile unless we are +# in between <pre></pre> in which case write out the output of tuptime. +my $inPreFlag = 0; +my $arrIndex = 0; +while (my $row = <$fh>) { + chomp $row; + # Create a new HTML tree to parse HTML tags from $row + my $tr = HTML::TreeBuilder->new_from_content($row); + + # If this line contains a <pre> tag, set the proper flag to begin printing + # output from tuptime. + if ($tr->find_by_tag_name('pre')) { + $inPreFlag = 1; + print "Entering pre\n"; + print $out "<pre><code>"; + next; + } + # Check if we have printed out every line from the output of tuptime + if ($arrIndex == scalar @output) { + # Reset arrIndex so the above doesn't continue to resolve to true + $arrIndex = 0; + $inPreFlag = 0; + print "Exiting pre\n"; + print $out "</code></pre>\n"; + } + + if ($inPreFlag) { + print $out "$output[$arrIndex]\n"; + $arrIndex++; + } + else { + print $out "$row\n"; + } +} + +# Finally, overwrite the old about-site file with this new one: +move './about-site.html.new', '/var/www/html/about-site.html'; +# And remove the copy of the old one +unlink('./about-site.html'); diff --git a/http/uploadwatch.sh b/http/uploadwatch.sh @@ -0,0 +1,9 @@ +#!/bin/bash + +DESTDIR=/var/www/ +WATCHDIR=/home/manager/uploads/ + +mkdir -p "$WATCHDIR" +touch /home/manager/upload.log + +find "$WATCHDIR" -mindepth 1 -maxdepth 1 -exec sh -c 'if [ ! "$1" = "" ]; then echo "==========" >> /home/manager/upload.log && rsync -vr "$1" "$2" >> /home/manager/upload.log && rm -r $1 && chown -R www-data:www-data "$2"; fi' - {} "$DESTDIR" \; diff --git a/public/img/floppy.jpg b/public/img/floppy.jpg Binary files differ. diff --git a/public/img/giorno-3.png b/public/img/giorno-3.png Binary files differ. diff --git a/public/img/hacker-quarterly-thumb.jpg b/public/img/hacker-quarterly-thumb.jpg Binary files differ. diff --git a/public/img/hacker-quarterly.jpg b/public/img/hacker-quarterly.jpg Binary files differ. diff --git a/public/img/home-directory.png b/public/img/home-directory.png Binary files differ. diff --git a/public/img/husky-screenshot-thumb.png b/public/img/husky-screenshot-thumb.png Binary files differ. diff --git a/public/img/husky-screenshot.png b/public/img/husky-screenshot.png Binary files differ. diff --git a/public/img/keyboard-side-thumb.jpg b/public/img/keyboard-side-thumb.jpg Binary files differ. diff --git a/public/img/keyboard-side.jpg b/public/img/keyboard-side.jpg Binary files differ. diff --git a/public/img/keyboard-top-thumb.jpg b/public/img/keyboard-top-thumb.jpg Binary files differ. diff --git a/public/img/keyboard-top.jpg b/public/img/keyboard-top.jpg Binary files differ. diff --git a/public/img/laptop-open-with-touchpad-thumb.jpg b/public/img/laptop-open-with-touchpad-thumb.jpg Binary files differ. diff --git a/public/img/laptop-open-with-touchpad.jpg b/public/img/laptop-open-with-touchpad.jpg Binary files differ. diff --git a/public/img/laptop-screenshot-old-thumb.png b/public/img/laptop-screenshot-old-thumb.png Binary files differ. diff --git a/public/img/laptop-screenshot-old.png b/public/img/laptop-screenshot-old.png Binary files differ. diff --git a/public/img/live-testing-touchpad-thumb.jpg b/public/img/live-testing-touchpad-thumb.jpg Binary files differ. diff --git a/public/img/live-testing-touchpad.jpg b/public/img/live-testing-touchpad.jpg Binary files differ. diff --git a/public/img/logo-256.png b/public/img/logo-256.png Binary files differ. diff --git a/public/img/logo-256x256.png b/public/img/logo-256x256.png Binary files differ. diff --git a/public/img/logo-ftp.png b/public/img/logo-ftp.png Binary files differ. diff --git a/public/img/logo-git-256.png b/public/img/logo-git-256.png Binary files differ. diff --git a/public/img/logo-git.png b/public/img/logo-git.png Binary files differ. diff --git a/public/img/logo-main-256.png b/public/img/logo-main-256.png Binary files differ. diff --git a/public/img/logo-main.png b/public/img/logo-main.png Binary files differ. diff --git a/public/img/logo-mastodon.png b/public/img/logo-mastodon.png Binary files differ. diff --git a/public/img/logo-matrix.png b/public/img/logo-matrix.png Binary files differ. diff --git a/public/img/logo-pleroma-128.png b/public/img/logo-pleroma-128.png Binary files differ. diff --git a/public/img/logo-pleroma-32.png b/public/img/logo-pleroma-32.png Binary files differ. diff --git a/public/img/logo-pleroma-512.png b/public/img/logo-pleroma-512.png Binary files differ. diff --git a/public/img/logo-wiki.png b/public/img/logo-wiki.png Binary files differ. diff --git a/public/img/ls-highlights.png b/public/img/ls-highlights.png Binary files differ. diff --git a/public/img/ls-no-highlights.png b/public/img/ls-no-highlights.png Binary files differ. diff --git a/public/img/lwn-homepage-colours.png b/public/img/lwn-homepage-colours.png Binary files differ. diff --git a/public/img/lwn-we-colours.png b/public/img/lwn-we-colours.png Binary files differ. diff --git a/public/img/mastodon-error-thumb.png b/public/img/mastodon-error-thumb.png Binary files differ. diff --git a/public/img/mastodon-error.png b/public/img/mastodon-error.png Binary files differ. diff --git a/public/img/mastodon-status-announcement.png b/public/img/mastodon-status-announcement.png Binary files differ. diff --git a/public/img/more-banned-ips.png b/public/img/more-banned-ips.png Binary files differ. diff --git a/public/img/mx-toolbox-results-thumb.png b/public/img/mx-toolbox-results-thumb.png Binary files differ. diff --git a/public/img/mx-toolbox-results.png b/public/img/mx-toolbox-results.png Binary files differ. diff --git a/public/img/neomutt-threading.png b/public/img/neomutt-threading.png Binary files differ. diff --git a/public/img/neomutt-thumb.png b/public/img/neomutt-thumb.png Binary files differ. diff --git a/public/img/neomutt.png b/public/img/neomutt.png Binary files differ. diff --git a/public/img/office-365-spam-thumb.png b/public/img/office-365-spam-thumb.png Binary files differ. diff --git a/public/img/office-365-spam.png b/public/img/office-365-spam.png Binary files differ. diff --git a/public/img/old-logo.png b/public/img/old-logo.png Binary files differ. diff --git a/public/img/paritybit-gopher-lynx-thumb.png b/public/img/paritybit-gopher-lynx-thumb.png Binary files differ. diff --git a/public/img/paritybit-gopher-lynx.png b/public/img/paritybit-gopher-lynx.png Binary files differ. diff --git a/public/img/projects/usrmnt/screenshot.png b/public/img/projects/usrmnt/screenshot.png Binary files differ. diff --git a/public/img/reporting-cisco-error-thumb.png b/public/img/reporting-cisco-error-thumb.png Binary files differ. diff --git a/public/img/reporting-cisco-error.png b/public/img/reporting-cisco-error.png Binary files differ. diff --git a/public/img/seo-report.png b/public/img/seo-report.png Binary files differ. diff --git a/public/img/slack-tracking.png b/public/img/slack-tracking.png Binary files differ. diff --git a/public/img/st-lynx-thumb.png b/public/img/st-lynx-thumb.png Binary files differ. diff --git a/public/img/st-lynx.png b/public/img/st-lynx.png Binary files differ. diff --git a/public/img/st-tc.png b/public/img/st-tc.png Binary files differ. diff --git a/public/img/st-vim.png b/public/img/st-vim.png Binary files differ. diff --git a/public/img/syncthing-dashboard-thumb.png b/public/img/syncthing-dashboard-thumb.png Binary files differ. diff --git a/public/img/syncthing-dashboard.png b/public/img/syncthing-dashboard.png Binary files differ. diff --git a/public/img/t420s/laptop-looking-good-thumb.jpg b/public/img/t420s/laptop-looking-good-thumb.jpg Binary files differ. diff --git a/public/img/t420s/laptop-looking-good.jpg b/public/img/t420s/laptop-looking-good.jpg Binary files differ. diff --git a/public/img/t420s/new-sticker-thumb.jpg b/public/img/t420s/new-sticker-thumb.jpg Binary files differ. diff --git a/public/img/t420s/new-sticker.jpg b/public/img/t420s/new-sticker.jpg Binary files differ. diff --git a/public/img/t420s/t420s-close-thumb.jpg b/public/img/t420s/t420s-close-thumb.jpg Binary files differ. diff --git a/public/img/t420s/t420s-close.jpg b/public/img/t420s/t420s-close.jpg Binary files differ. diff --git a/public/img/t420s/t420s-thinklight-thumb.jpg b/public/img/t420s/t420s-thinklight-thumb.jpg Binary files differ. diff --git a/public/img/t420s/t420s-thinklight.jpg b/public/img/t420s/t420s-thinklight.jpg Binary files differ. diff --git a/public/img/t420s/t420s-trackpad-thumb.jpg b/public/img/t420s/t420s-trackpad-thumb.jpg Binary files differ. diff --git a/public/img/t420s/t420s-trackpad.jpg b/public/img/t420s/t420s-trackpad.jpg Binary files differ. diff --git a/public/img/t420s/t420s-wide-thumb.jpg b/public/img/t420s/t420s-wide-thumb.jpg Binary files differ. diff --git a/public/img/t420s/t420s-wide.jpg b/public/img/t420s/t420s-wide.jpg Binary files differ. diff --git a/public/img/urxvt-lynx-thumb.png b/public/img/urxvt-lynx-thumb.png Binary files differ. diff --git a/public/img/urxvt-lynx.png b/public/img/urxvt-lynx.png Binary files differ. diff --git a/public/img/urxvt-tc.png b/public/img/urxvt-tc.png Binary files differ. diff --git a/public/img/urxvt-vim.png b/public/img/urxvt-vim.png Binary files differ. diff --git a/public/img/valid-rss-rogers.png b/public/img/valid-rss-rogers.png Binary files differ. diff --git a/public/img/vcss.gif b/public/img/vcss.gif Binary files differ. diff --git a/public/img/vim-airline.gif b/public/img/vim-airline.gif Binary files differ. diff --git a/public/img/vim-airline.mp4 b/public/img/vim-airline.mp4 Binary files differ. diff --git a/public/img/vim-no-airline.gif b/public/img/vim-no-airline.gif Binary files differ. diff --git a/public/img/vim-no-airline.mp4 b/public/img/vim-no-airline.mp4 Binary files differ. diff --git a/public/js/borderlands-3-dps-calculator.js b/public/js/borderlands-3-dps-calculator.js @@ -1,151 +0,0 @@ -"use strict"; -/* - * borderlands-3-dps-calculator.js - * Contains backend code for generation of game parameters - * - * Copyright (C) 2019 Leon Baram, Jake Bauer - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <https://www.gnu.org/licenses/>. - */ - -/* - * mults_g: - * A dictionary of elemental damage multipliers based on healthbar type. - * Entries are organized in order of "health, shields, armor", - * with first-row entries corresponding to Normal Mode, - * and second-row entries corresponding to True Vault Hunter Mode. - * - * all multiplier values sourced from - * https://borderlands.fandom.com/wiki/Elemental_damage#Borderlands_3 - * in particular, the following table: - * Flesh Shield Armor - Normal TVHM Normal TVHM Normal TVHM -Kinetic 100% 100% 100% 100% 80% 80% -Incendiary 150% 175% 70% 50% 70% 50% -Shock 80% 65% 200% 250% 80% 65% -Corrosive 80% 65% 70% 50% 150% 175% -Cryo 100% 100% 70% 50% 120% 150% -Radiation 100% 100% 100% 150% 70% 50% -*/ -const mults_g = { - None: [ - [1.0, 1.0, 0.8], - [1.0, 1.0, 0.8] - ], - Fire: [ - [1.5, 0.7, 0.7], - [1.75, 0.5, 0.5] - ], - Shock: [ - [0.8, 2.0, 0.8], - [0.65, 2.5, 0.65] - ], - Acid: [ - [0.8, 0.7, 1.5], - [0.65, 0.5, 1.75] - ], - Cryo: [ - [1.0, 0.7, 1.2], - [1.0, 0.5, 1.5] - ], - Rad: [ - [1.0, 1.0, 0.7], - [1.0, 1.5, 0.5] - ] -}; - -/** - * gun properties (except "elmnt" and "tvhm") - */ -const properties_g = [ - "dmg","dmg-mult","rload","frate","mag","ammo" -]; - -/* - * function dps(): - * Preconditions: - * dmg (base gun damage) and mag (magazine size) are positive ints > 0 - * acc (gun accuracy) is a float within [0,100] - * rload (reload time in seconds) and frate (shots fired per second) are positive floats - * element (elemental effect type) is a string - * edmg (elemental effect damage) is a nonnegative int >= 0 - * echance (elemental effect chance) is a float within [0,1] - * TVHM (True Vault Hunter Mode) is a boolean - * - * Postconditions: - * dps is an array of three floats - * dps[0] is average DPS against flesh (red health bar) - * dps[1] is average DPS against shields (blue health bar) - * dps[2] is average DPS against armor (yellow health bar) -*/ -function calculateDPS(gun, effectDuration) { - let dps = []; - - for (let i = 0; i < 3; i++) { - dps[i] = mults_g[gun.elmnt][gun.tvhm][i]; - dps[i] *= (gun["dmg"] * gun["dmg-mult"] * (gun["mag"] / gun ["ammo"])) / - (gun["rload"] + (gun["mag"] / gun["ammo"]) / gun["frate"]); - } - - return dps; -} - -function gamerMoment2() { - - let gun = {}; - let e; - let dpsResult; - let effectDuration; - - for (let str of properties_g) { - gun[str] = parseFloat(document.getElementById(str + "2").value); - if (! gun[str]) - gun[str] = 0; - } - - e = document.getElementById("elmnt2"); - gun["elmnt"] = e.options[e.selectedIndex].value; - gun["tvhm"] = document.getElementById("tvhm2").checked ? 1 : 0; - - dpsResult = calculateDPS(gun, effectDuration); - - document.getElementById("flesh2").innerHTML = dpsResult[0].toFixed(2); - document.getElementById("shields2").innerHTML = dpsResult[1].toFixed(2); - document.getElementById("armour2").innerHTML = dpsResult[2].toFixed(2); -} - -function gamerMoment() { - - let gun = {}; - let e; - let dpsResult; - let effectDuration; - - for (let str of properties_g) { - gun[str] = parseFloat(document.getElementById(str).value); - if (! gun[str]) - gun[str] = 0; - } - - e = document.getElementById("elmnt"); - gun["elmnt"] = e.options[e.selectedIndex].value; - gun["tvhm"] = document.getElementById("tvhm").checked ? 1 : 0; - - dpsResult = calculateDPS(gun, effectDuration); - - document.getElementById("flesh").innerHTML = dpsResult[0].toFixed(2); - document.getElementById("shields").innerHTML = dpsResult[1].toFixed(2); - document.getElementById("armour").innerHTML = dpsResult[2].toFixed(2); - gamerMoment2(); -} diff --git a/public/js/generator.js b/public/js/generator.js @@ -1,79 +0,0 @@ -/* -* generator.js -* Contains backend code for generation of game parameters -* -* This file is part of MorrowindGameGen -* Copyright (C) 2019 Jake Bauer -* -* This program is free software: you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see <https://www.gnu.org/licenses/>. -*/ - -function charGen() { - - const factions = ["Great House Redoran", "Great House Hlaalu", "Great House Telvanni", - "Vampire Clan Aundae", "Vampire Clan Berne", "Vampire Clan Quarra", - "Tribunal Temple", "Imperial Cult", "Sixth House or a Daedra Cult", - "Fighter's Guild", "Mage's Guild", "Thieves Guild", "Blades", - "Morag Tong", "Imperial Legion", "East Empire Company"]; - - const classes = ["Acrobat", "Agent", "Archer", "Assassin", "Barbarian", - "Bard", "Battlemage", "Crusader", "Healer", "Knight", "Mage", "Monk", - "Nightblade", "Pilgrim", "Rogue", "Scout", "Sorcerer", "Spellsword", - "Thief", "Warrior", "Witchhunter"]; - - const hometowns = ["Ald Velothi", "Ald'ruhn", "Balmora", "Caldera", - "Dagon Fel", "Ebonheart", "Gnisis", "Hla Oad", "Khuul", "Maar Gan", - "Molag Mar", "Mournhold", "Pelagiad", "Sadrith Mora", "Seyda Neen", - "Skaal Village", "Suran", "Tel Aruhn", "Tel Branora", "Tel Fyr", - "Tel Mora", "Vivec", "Vos"]; - - const birthsigns = ["Warrior", "Mage", "Thief", "Serpent", "Lady", "Steed", - "Lord", "Apprentice", "Atronach", "Ritual", "Lover", "Shadow", "Tower"]; - - const races = ["Altmer", "Argonian", "Bosmer", "Breton", "Dunmer", - "Imperial", "Khajiit", "Nord", "Orc", "Redguard"]; - - let firstFaction = Math.floor(Math.random() * factions.length); - document.getElementById("factionField1").value = factions[firstFaction]; - document.getElementById("factionField2").value = factions[secondFaction(firstFaction, factions)]; - document.getElementById("classField").value = classes[Math.floor(Math.random()*classes.length)]; - document.getElementById("hometownField").value = hometowns[Math.floor(Math.random()*hometowns.length)]; - document.getElementById("birthsignField").value = birthsigns[Math.floor(Math.random()*birthsigns.length)]; - document.getElementById("raceField").value = races[Math.floor(Math.random()*races.length)]; -} - -function secondFaction(firstFaction, factions){ - let result = firstFaction; - // If the player has already been assigned a great house, choose a non-great - // house faction instead (player cannot be a member of more than one). - if (firstFaction <= 2) - while (result <= 2) - result = Math.floor(Math.random()*factions.length); - // If player is a member of one of the vampire clans, choose another faction - // that isn't a vampire clan (player cannot be a member of more than one). - else if (firstFaction >= 3 && firstFaction <= 5) - while (result >= 3 && result <= 5) - result = Math.floor(Math.random()*factions.length); - // If a player is a member of one of the cults, choose another faction that - // isn't another cult (otherwise it wouldn't make sense roleplay-wise). - else if (firstFaction >= 6 && firstFaction <= 8) - while (result >= 6 && result <= 8) - result = Math.floor(Math.random()*factions.length); - // If none of the above conditions are true, choose any faction other than - // the one already chosen. - else - while (result === firstFaction) - result = Math.floor(Math.random()*factions.length); - return (result); -} diff --git a/public/js/initiative.js b/public/js/initiative.js @@ -1,171 +0,0 @@ -/*initiative.js -* Copyright (C) 2019 Jake Bauer -* -* This program is free software: you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see <https://www.gnu.org/licenses/>. -*/ - -// Global variable keeping track of all characters added to the list. -let charArray = []; - -/* draw() - * @brief Draws a character, their information, and the relevant buttons to the - * viewport. - * @input char The character to draw - * @input position That character's position in the charArray (used to give the - * div a corresponding id attribute); - */ -function draw(char, position) { - let list = document.getElementById("initiative-list"); - let div = document.createElement('div'); - div.setAttribute("class","initiative-div"); - div.setAttribute("id", position); - list.insertBefore(div, list.childNodes[list.childNodes.length-1]); - - let charName = document.createElement('p'); - let textNode = document.createTextNode(char.name); - charName.appendChild(textNode); - charName.setAttribute("class", "in-name"); - div.appendChild(charName); - - let charInit = document.createElement('p'); - textNode = document.createTextNode(char.initiative); - charInit.appendChild(textNode); - charInit.setAttribute("class", "in-val"); - div.appendChild(charInit); - - let editBtn = document.createElement('button'); - let pencil = document.createElement('strong'); - textNode = document.createTextNode("✎"); - pencil.setAttribute("class", "green-pencil"); - pencil.appendChild(textNode); - editBtn.setAttribute("class", "in-edit-btn"); - editBtn.setAttribute("onClick", "editChar(this)"); - div.appendChild(editBtn); - editBtn.appendChild(pencil); - textNode = document.createTextNode(" Edit"); - editBtn.appendChild(textNode); - - let removeBtn = document.createElement('button'); - let x = document.createElement('strong'); - textNode = document.createTextNode("X"); - x.setAttribute("class", "red-x"); - x.appendChild(textNode); - removeBtn.setAttribute("class", "in-rem-btn"); - removeBtn.setAttribute("onClick", "removeChar(this)"); - div.appendChild(removeBtn); - removeBtn.appendChild(x); - textNode = document.createTextNode(" Remove"); - removeBtn.appendChild(textNode); -} - -/* compare() - * @brief Used by sortList() to determine the sorted order. Sorts by greatest to - * least initative value for each character. - * @see sortList() - */ -function compare(a, b) { - if (a.initiative < b.initiative) - return 1; - if (a.initiative > b.initiative) - return -1; - else - return 0; -} - -/* sortList() - * @brief Sort the list of characters by their initative value - * @see compare() - */ -function sortList() { - // Sorts in order largest to smallest - charArray.sort(compare); - // Delete all divs of class initiative-div - for (let i = 0; i < charArray.length; i++) { - let element = document.getElementById(i); - element.parentNode.removeChild(element); - } - // Then re-draw them - for (let i = 0; i < charArray.length; i++) { - draw(charArray[i], i); - } -} - -/* addChar() - * @brief Add a character to the list and sort the list - */ -function addChar() { - let newChar = {}; - nameField = document.getElementById("char-name"); - initField = document.getElementById("init-val"); - newChar.name = nameField.value; - newChar.initiative = Number(initField.value); - nameField.value = null; - initField.value = null; - if (newChar.name == "" || newChar.initiative == null) { - alert("Please fill out both fields before adding a character."); - return; - } - draw(newChar, charArray.length); - charArray.push(newChar); - sortList(); -} - -/* editChar() - * @brief Edit a characters initiative value and re-sort - * @input Elem The "edit" button clicked used to identify which character - * to edit - */ -function editChar(elem) { - let newVal = prompt("Enter the new value:", "0"); - if (newVal != null) { - // Edit the value in the array of characters - let charIndex = elem.parentNode.getAttribute("id"); - charArray[charIndex].initiative = Number(newVal); - // Modify the number displayed for that character - let parentNode = elem.parentNode; - for (let i = 0; i < elem.parentNode.childNodes.length; i++) { - if (parentNode.childNodes[i].className == "in-val") { - parentNode.childNodes[i].innerHTML = newVal; - break; - } - } - sortList(); - } - else { - return; - } -} - -/* removeChar() - * @brief Removes a character from the list of characters - * @input Elem The "remove" button clicked used to identify which character - * to remove - */ -function removeChar(elem) { - let charIndex = elem.parentNode.getAttribute("id"); - for (let i = 0; i < charArray.length; i++) { - if (i == charIndex) { - charArray.splice(i,1); - } - } - // Delete all divs of class initiative-div - for (let i = 0; i <= charArray.length; i++) { - let element = document.getElementById(i); - element.parentNode.removeChild(element); - } - // Then re-draw them - for (let i = 0; i < charArray.length; i++) { - draw(charArray[i], i); - } -} diff --git a/public/js/roll.js b/public/js/roll.js @@ -1,147 +0,0 @@ -/*roll.js -* Copyright (C) 2019 Jake Bauer -* -* This program is free software: you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see <https://www.gnu.org/licenses/>. -*/ - -/* stringRoll() - * @brief This function rolls dice based on the input from the text-field - */ -function stringRoll() { - let rollString = document.getElementById("inputString").value; - let result = 0; - let numRolls, die, operation, modifier, resultStr = ""; - - // Parse values from string - try { - numRolls = rollString.match(/\d+d/ig)[0]; - numRolls = numRolls.substring(0, numRolls.length-1); - die = rollString.match(/d\d+/ig)[0]; - die = die.substring(1); - } - catch(err) { - console.log(err); - alert("Invalid text input! See example for proper string format."); - return; - } - try { - operation = rollString.match(/[\+\-]/ig)[0]; - modifier = rollString.match(/\d+$/ig)[0]; - } - catch(TypeError) { - // Ignore missing operation or modifier strings - } - - // Conduct rolls - for (let i = 0; i < numRolls; i++) { - let intermediate = Math.floor((Math.random()*die)+1); - if (i == numRolls-1) { - // If it's the last roll, don't add a + symbol to the string - resultStr += intermediate; - } - else { - resultStr += intermediate + " + "; - } - result += intermediate; - } - // Finalize the result string - resultStr += " = " + result; - if (numRolls == 1) { - resultStr = result; - } - // Apply the modifier - resultStr = "d"+ die + ": " + resultStr; - if (operation === '-') { - result = Number(result) - Number(modifier); - resultStr += " - " + modifier + " = " + result; - } - else if (operation === '+') { - result = Number(result) + Number(modifier); - resultStr += " + " + modifier + " = " + result; - } - // Add the result to the history box - let hist = document.getElementById("history-text"); - hist.innerHTML = (resultStr + "\n") + hist.innerHTML; -} - -/* roll() - * @brief This function rolls the dice according to which button was pressed - * @input Element The button representing which dice to roll - */ -function roll(element) { - let btnId = (element.id).substring(1); - let numRolls = document.getElementById(('num'+btnId)).value; - let modifier = document.getElementById(('mod'+btnId)).value; - let result = 0; - let resultStr = ""; - // Conduct rolls - for (let i = 0; i < numRolls; i++) { - let intermediate = Math.floor((Math.random()*btnId)+1); - if (i == numRolls-1) { - // If it's the last roll, don't add a + symbol to the string - resultStr += intermediate; - } - else { - resultStr += intermediate + " + "; - } - result += intermediate; - } - // Finalize the result string - resultStr += " = " + result; - if (numRolls == 1) { - resultStr = result; - } - // Apply the modifier - result = Number(result) + Number(modifier); - resultStr = "d"+ btnId + ": " + resultStr; - if (modifier < 0) { - resultStr += " - " + Math.abs(modifier) + " = " + result; - } - else if (modifier > 0) { - resultStr += " + " + modifier + " = " + result; - } - // Show the result as a number in the die's row - document.getElementById(("d"+btnId+"result")).innerHTML = result; - // Add the result to the history box - let hist = document.getElementById("history-text"); - hist.innerHTML = (resultStr + "\n") + hist.innerHTML; -} - -/* clear_history() - * @brief This function clears the history box, restting it back to default - * values while also clearing results and input boxes. - */ -function clear_history() { - let results = document.getElementsByTagName("p"); - for (let i = 0; i < Object.keys(results).length; i++) { - element = results[i]; - if (element.getAttribute("class") == "field") { - element.innerHTML = "0"; - } - } - let inputs = document.getElementsByTagName("input"); - for (let i = 0; i < Object.keys(inputs).length; i++) { - element = inputs[i]; - if (element.getAttribute("type") == "number") { - if (element.getAttribute("min")) { - element.value = 1; - } - else { - element.value = 0; - } - } - } - let hist = document.getElementById("history-text"); - hist.innerHTML = "-------&#13;&#10;History"; -} diff --git a/public/js/time-duration-calculator.js b/public/js/time-duration-calculator.js @@ -1,116 +0,0 @@ -/* -* time-duration-calculator.js -* -* Copyright (C) 2020 Jake Bauer <jbauer@paritybit.ca> -* -* This program is free software: you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see <https://www.gnu.org/licenses/>. -*/ - -startTimeH = 0; -startTimeM = 0; -startTimeS = 0; - -endTimeH = 0; -endTimeM = 0; -endTimeS = 0; - -resultTimeH = 0; -resultTimeM = 0; -resultTimeS = 0; - -totalTimeH = 0; -totalTimeM = 0; -totalTimeS = 0; - -// From: https://gist.github.com/andrewrk/4382935 -function pad_with_zeros(number, size) { - number = number.toString(); - while (number.length < size) number = "0" + number; - return number; -} - -function clear_inputs() { - document.getElementById("start-time-h").value = ""; - document.getElementById("start-time-m").value = ""; - document.getElementById("start-time-s").value = ""; - document.getElementById("end-time-h").value = ""; - document.getElementById("end-time-m").value = ""; - document.getElementById("end-time-s").value = ""; -} - -function get_inputs() { - startTimeH = Number(document.getElementById("start-time-h").value); - startTimeM = Number(document.getElementById("start-time-m").value); - startTimeS = Number(document.getElementById("start-time-s").value); - endTimeH = Number(document.getElementById("end-time-h").value); - endTimeM = Number(document.getElementById("end-time-m").value); - endTimeS = Number(document.getElementById("end-time-s").value); - - if (startTimeH < 0 || startTimeH > 23 || endTimeH < 0 || endTimeH > 23) { - alert("Hours must be between 0 and 23"); - throw "Error: Number out of bounds."; - } - if (startTimeM < 0 || startTimeM > 59 || endTimeM < 0 || endTimeM > 59 - || startTimeS < 0 || startTimeS > 59 || endTimeS < 0 || endTimeS > 59) { - alert("Seconds/Minutes must be between 0 and 59"); - throw "Error: Number out of bounds."; - } -} - -function display_results() { - resultString = pad_with_zeros(resultTimeH, 2) + - "h:" + pad_with_zeros(resultTimeM, 2) + - "m:" + pad_with_zeros(resultTimeS, 2) + "s"; - document.getElementById("result-field").innerHTML = resultString; - document.getElementById("result-field-hours").innerHTML = totalTimeH.toFixed(4); - document.getElementById("result-field-minutes").innerHTML = totalTimeM.toFixed(4); - document.getElementById("result-field-seconds").innerHTML = totalTimeS; -} - -function calculate() { - get_inputs(); - - // Seconds - if (endTimeS < startTimeS) { - resultTimeS = (endTimeS + 60) - startTimeS; - endTimeM--; - } - else { - resultTimeS = endTimeS - startTimeS; - } - - // Minutes - if (endTimeM < startTimeM) { - resultTimeM = (endTimeM + 60) - startTimeM; - endTimeH--; - } - else { - resultTimeM = endTimeM - startTimeM; - } - - // Hours - if (endTimeH < startTimeH) { - resultTimeH = (endTimeH + 24) - startTimeH; - } - else { - resultTimeH = endTimeH - startTimeH; - } - - // Single-unit totals - totalTimeH = resultTimeH + (resultTimeM / 60) + (resultTimeS / 3600); - totalTimeM = (resultTimeH * 60) + resultTimeM + (resultTimeS / 60); - totalTimeS = (resultTimeH * 3600) + (resultTimeM * 60) + resultTimeS; - - display_results(); -} diff --git a/public/mstile-144x144.png b/public/mstile-144x144.png Binary files differ. diff --git a/public/mstile-150x150.png b/public/mstile-150x150.png Binary files differ. diff --git a/public/mstile-310x150.png b/public/mstile-310x150.png Binary files differ. diff --git a/public/mstile-310x310.png b/public/mstile-310x310.png Binary files differ. diff --git a/public/mstile-70x70.png b/public/mstile-70x70.png Binary files differ. diff --git a/public/robots.txt b/public/robots.txt @@ -1,3 +0,0 @@ -Sitemap: https://www.paritybit.ca/sitemap.xml -User-agent: * -Disallow: diff --git a/public/safari-pinned-tab.svg b/public/safari-pinned-tab.svg @@ -1 +0,0 @@ -<svg version="1" xmlns="http://www.w3.org/2000/svg" width="933.333" height="933.333" viewBox="0 0 700.000000 700.000000"><path d="M327.8.5c-.1.1-4.1.5-8.8.9-8.7.7-10.5.9-22.5 2.7-11.6 1.8-12.3 1.9-19.2 3.5-22.7 5.1-37.3 9.5-55.3 16.6C154.7 50.8 96.6 98 57.5 158c-11.4 17.5-19.8 32.7-26 47-2.1 4.7-4.5 10.3-5.5 12.5-5.6 12.8-15.1 42.7-17.5 55.6-.3 1.3-1.1 5.8-2 9.9-2.9 14.7-3.6 20-5.2 37-1.5 16.4-.8 59.2 1.2 71.1.2 1.3.6 4.6.9 7.4.9 7.8 2.3 15.6 5.1 28.5 3.1 14.2 10.9 39.3 17.5 55.5 4.9 12.3 17.3 37 23.5 46.8 3 4.9 5.5 9.2 5.5 9.7 0 .4.3 1 .8 1.2.4.2 3.3 4.1 6.4 8.8 6.3 9.4 21 28 29 36.6 20.6 22 41.2 39.8 63.8 54.8 17.8 11.7 20.8 13.6 36.5 21.5 33.9 17.3 74 30 109 34.6 2.2.2 5.6.7 7.5 1 18.6 2.6 69.7 2.7 83.7.1 1.7-.3 10.4-1.6 14.8-2.1 6.1-.8 20.6-4 32-7 38.6-10.3 71.3-24.8 103.8-46.3 26.7-17.6 51.1-38.8 70-60.7 3.3-3.9 6.3-7.2 6.7-7.5 1.2-1 13.7-17.6 19.2-25.5 10.7-15.4 23-37.3 30.5-54 6.3-14.1 7.1-16.2 10.6-26 4.6-13.1 7.2-21.5 9.3-29.5 1.5-6.3 1.8-7.4 2.9-12.3 1.4-6 5.5-29.9 6-35.2.4-3.3.9-7.1 1.1-8.5.9-4.7 1.1-52.5.3-60.5-1.5-16.5-2.1-22-2.4-22.5-.2-.3-.6-3-1-6s-2.2-12.3-4-20.5c-5.3-23.2-10.2-38.6-19.7-60.9-39.1-92-116.9-163.5-212.1-195.1-15.6-5.1-41-11.3-53.7-13-1.9-.3-4.6-.7-6-1-1.3-.2-5.2-.7-8.6-1.1-3.3-.3-7.4-.8-9-1-3.2-.5-54-1.4-54.6-.9zm46.7 87c8.1.7 14.6 1.5 17.1 2 1.2.3 3.9.7 6 1.1 3.3.4 8.7 1.7 26.6 5.9 2.5.6 20 6.5 22.3 7.5 1.1.5 4.9 2.1 8.5 3.6 3.6 1.4 11 4.9 16.5 7.7 55.1 28 98.6 74.3 123.8 131.7 8.7 19.7 16.4 48.1 19.1 70.5 2.6 20.3 2.6 48.6.1 66.3-1.2 9.2-1.7 12.3-3.1 19.2-16.5 83.2-73.6 154.6-151.4 189.2-18.8 8.4-43.3 16.3-57 18.3-2.5.4-4.7.8-5 1-1 .6-16.6 2.6-26 3.2-18.6 1.4-43.5.6-58.5-1.6-35-5.4-70.2-17.8-97.3-34.2-3.5-2.1-6.6-3.9-6.9-3.9-.3 0-1.5-.8-2.8-1.8-1.2-.9-3.3-2.4-4.5-3.2-3.9-2.6-13.8-9.8-16.2-11.8-1.3-1.1-4.5-3.9-7.3-6.2-25.6-21.6-49.3-51.6-64.1-81.1C109 460.1 102 444 102.7 444c.3 0 .1-.6-.4-1.3-3-3.6-12-38.4-13.8-52.6-.4-3-.8-6.3-1-7.3-.8-4-1.7-21.2-1.8-32.1 0-14.7.9-26.4 3.4-42.2 1.5-10 1.9-11.5 5.4-25 5.2-19.9 9.3-30.8 19.8-51.7 29.6-59.2 82.2-105.9 145.7-129.3 22.9-8.4 47.5-13.6 71.5-15.1 5.5-.4 10.1-.7 10.2-.9.5-.3 26.7.4 32.8 1z"/><path d="M344.7 157.6c-.1.1-4 .4-8.7.8-11.6.8-17.4 1.6-25 3.2-3.6.8-7.6 1.7-9 2-3 .6-14.7 4.2-17.5 5.4-1.1.5-4.2 1.6-7 2.6-13.4 4.8-35.9 18.1-50.2 29.6-3.9 3.2-7.9 5.8-8.7 5.8-.9 0-1.6.6-1.6 1.3 0 .8-3 4.5-6.6 8.3-28.2 29.4-45.5 63.6-52.6 103.9-3.2 18-3.1 49.8.3 66.8 7.8 39.9 25.3 73.6 53.1 102.1 4.1 4.3 5.8 6.8 5.8 8.7 0 2.2.4 2.6 2.3 2.2 1.6-.3 4.7 1.4 11.1 6.3 47.7 35.9 103.5 48.5 161.2 36.4 8.8-1.9 25.6-6.9 29.9-8.9 1.1-.6 4.3-2 7-3.1 13.5-5.8 28.5-14.7 41.2-24.6 4.5-3.5 8.9-6.4 9.7-6.4.9 0 1.6-.6 1.6-1.3 0-.6 3.4-4.8 7.6-9.1 23.6-24.6 39.3-51.1 48.4-81.9 5.4-18.1 7.5-33.3 7.5-55.2 0-17.7-.5-23.4-3.5-38-6.4-32-19.6-60-40.3-85.3-30.7-37.5-73.5-61.8-122.7-69.6-4.9-.8-32.7-2.5-33.3-2z"/></svg> -\ No newline at end of file diff --git a/public/site.webmanifest b/public/site.webmanifest @@ -1,19 +0,0 @@ -{ - "name": "", - "short_name": "", - "icons": [ - { - "src": "/android-chrome-192x192.png", - "sizes": "192x192", - "type": "image/png" - }, - { - "src": "/android-chrome-512x512.png", - "sizes": "512x512", - "type": "image/png" - } - ], - "theme_color": "#ffffff", - "background_color": "#ffffff", - "display": "standalone" -} diff --git a/public/sitemap.xml b/public/sitemap.xml @@ -1,130 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> - <url><loc>https://www.paritybit.ca</loc></url> - <url><loc>https://www.paritybit.ca/home</loc></url> - <url><loc>https://www.paritybit.ca/blog</loc></url> - <url><loc>https://www.paritybit.ca/blog/gomux-is-the-best-cli-matrix-client</loc></url> - <url><loc>https://www.paritybit.ca/blog/why-irc-is-still-good</loc></url> - <url><loc>https://www.paritybit.ca/blog/btw-i-use-arch</loc></url> - <url><loc>https://www.paritybit.ca/blog/nope-back-to-st</loc></url> - <url><loc>https://www.paritybit.ca/blog/setting-up-weechat-again</loc></url> - <url><loc>https://www.paritybit.ca/blog/my-top-10-most-used-commands</loc></url> - <url><loc>https://www.paritybit.ca/blog/the-hacker-quarterly-magazine</loc></url> - <url><loc>https://www.paritybit.ca/blog/ethical-investing</loc></url> - <url><loc>https://www.paritybit.ca/blog/choosing-an-investment-brokerage</loc></url> - <url><loc>https://www.paritybit.ca/blog/the-marble-man</loc></url> - <url><loc>https://www.paritybit.ca/blog/my-preferred-fediverse-mobile-client</loc></url> - <url><loc>https://www.paritybit.ca/blog/posting-statuses-on-pleroma-with-a-shell-script</loc></url> - <url><loc>https://www.paritybit.ca/blog/how-to-not-make-an-ass-of-yourself-internet-discussions</loc></url> - <url><loc>https://www.paritybit.ca/blog/gentoo-isnt-for-me</loc></url> - <url><loc>https://www.paritybit.ca/blog/adding-image-optimization-to-my-static-site-generator</loc></url> - <url><loc>https://www.paritybit.ca/blog/use-xterm-256color-with-alacritty</loc></url> - <url><loc>https://www.paritybit.ca/blog/my-journey-with-computers</loc></url> - <url><loc>https://www.paritybit.ca/blog/vortex-vibe-keyboard</loc></url> - <url><loc>https://www.paritybit.ca/blog/my-git-server-was-ddosed</loc></url> - <url><loc>https://www.paritybit.ca/blog/mastodon-to-pleroma-3-shutting-down-mastodon</loc></url> - <url><loc>https://www.paritybit.ca/blog/i-was-wrong</loc></url> - <url><loc>https://www.paritybit.ca/blog/switching-to-alacritty</loc></url> - <url><loc>https://www.paritybit.ca/blog/two-truths-and-a-lie</loc></url> - <url><loc>https://www.paritybit.ca/blog/mastodon-to-pleroma-2-customizing-my-instance</loc></url> - <url><loc>https://www.paritybit.ca/blog/mastodon-to-pleroma-1-setting-up-a-pleroma-server</loc></url> - <url><loc>https://www.paritybit.ca/blog/two-months-with-aerc</loc></url> - <url><loc>https://www.paritybit.ca/blog/my-attempts-to-fix-my-mastodon-instance</loc></url> - <url><loc>https://www.paritybit.ca/blog/why-i-hate-the-term-modern</loc></url> - <url><loc>https://www.paritybit.ca/blog/be-a-good-netizen</loc></url> - <url><loc>https://www.paritybit.ca/blog/debian-with-btrfs</loc></url> - <url><loc>https://www.paritybit.ca/blog/using-rm-with-trash</loc></url> - <url><loc>https://www.paritybit.ca/blog/new-desktop-checklist</loc></url> - <url><loc>https://www.paritybit.ca/blog/new-server-checklist</loc></url> - <url><loc>https://www.paritybit.ca/blog/machine-hostnames</loc></url> - <url><loc>https://www.paritybit.ca/blog/colours-for-gitea-issues</loc></url> - <url><loc>https://www.paritybit.ca/blog/migrating-my-wiki-off-of-mediawiki</loc></url> - <url><loc>https://www.paritybit.ca/blog/my-todo-solution</loc></url> - <url><loc>https://www.paritybit.ca/blog/are-todo-applications-a-waste-of-time</loc></url> - <url><loc>https://www.paritybit.ca/blog/improving-blog-searching</loc></url> - <url><loc>https://www.paritybit.ca/blog/switching-to-cgit</loc></url> - <url><loc>https://www.paritybit.ca/blog/generating-my-geek-code</loc></url> - <url><loc>https://www.paritybit.ca/blog/adding-search-to-my-blog</loc></url> - <url><loc>https://www.paritybit.ca/blog/a-month-and-a-half-of-self-hosted-email</loc></url> - <url><loc>https://www.paritybit.ca/blog/how-i-keep-my-home-directory-clean</loc></url> - <url><loc>https://www.paritybit.ca/blog/my-first-ctf</loc></url> - <url><loc>https://www.paritybit.ca/blog/use-syncthing-to-sync-things</loc></url> - <url><loc>https://www.paritybit.ca/blog/why-dwm-swallowing-cant-swallow-tmux</loc></url> - <url><loc>https://www.paritybit.ca/blog/switching-to-debian-sid</loc></url> - <url><loc>https://www.paritybit.ca/blog/my-lwn-theme</loc></url> - <url><loc>https://www.paritybit.ca/blog/reflecting-on-50-days-of-blogging</loc></url> - <url><loc>https://www.paritybit.ca/blog/how-to-create-an-rss-feed-for-your-blog-3</loc></url> - <url><loc>https://www.paritybit.ca/blog/how-to-create-an-rss-feed-for-your-blog-2</loc></url> - <url><loc>https://www.paritybit.ca/blog/how-to-create-an-rss-feed-for-your-blog-1</loc></url> - <url><loc>https://www.paritybit.ca/blog/my-beginnings-with-gentoo</loc></url> - <url><loc>https://www.paritybit.ca/blog/my-new-t420s</loc></url> - <url><loc>https://www.paritybit.ca/blog/announcing-kontaktb</loc></url> - <url><loc>https://www.paritybit.ca/blog/how-i-manage-my-dotfiles</loc></url> - <url><loc>https://www.paritybit.ca/blog/making-my-site-easier-to-read</loc></url> - <url><loc>https://www.paritybit.ca/blog/improving-my-blog-post-publishing-script</loc></url> - <url><loc>https://www.paritybit.ca/blog/trying-out-dwm</loc></url> - <url><loc>https://www.paritybit.ca/blog/setting-up-a-status-page</loc></url> - <url><loc>https://www.paritybit.ca/blog/scripting-my-way-to-success</loc></url> - <url><loc>https://www.paritybit.ca/blog/curating-my-blogroll</loc></url> - <url><loc>https://www.paritybit.ca/blog/why-email-is-the-best-discussion-platform</loc></url> - <url><loc>https://www.paritybit.ca/blog/toggling-between-indentation-styles-in-vim</loc></url> - <url><loc>https://www.paritybit.ca/blog/dnd-xp-system</loc></url> - <url><loc>https://www.paritybit.ca/blog/it-doesnt-have-to-be-perfect</loc></url> - <url><loc>https://www.paritybit.ca/blog/book-review-the-mediocre-programmer</loc></url> - <url><loc>https://www.paritybit.ca/blog/a-quick-rant-about-web-font-sizes</loc></url> - <url><loc>https://www.paritybit.ca/blog/i-like-perl</loc></url> - <url><loc>https://www.paritybit.ca/blog/choosing-a-self-hosted-git-service</loc></url> - <url><loc>https://www.paritybit.ca/blog/going-from-user-to-contributor-with-foss</loc></url> - <url><loc>https://www.paritybit.ca/blog/paying-for-software</loc></url> - <url><loc>https://www.paritybit.ca/blog/two-of-the-most-valuable-lessons-ive-learned</loc></url> - <url><loc>https://www.paritybit.ca/blog/rewriting-my-static-site-generator</loc></url> - <url><loc>https://www.paritybit.ca/blog/self-hosted-mail-now-live</loc></url> - <url><loc>https://www.paritybit.ca/blog/attempting-to-replace-my-thinkpads-touchpad</loc></url> - <url><loc>https://www.paritybit.ca/blog/trying-out-aerc</loc></url> - <url><loc>https://www.paritybit.ca/blog/setting-up-gpg-keys-from-scratch</loc></url> - <url><loc>https://www.paritybit.ca/blog/self-hosting-email</loc></url> - <url><loc>https://www.paritybit.ca/blog/preparing-to-self-host-email</loc></url> - <url><loc>https://www.paritybit.ca/blog/diving-deeper-into-the-small-internet</loc></url> - <url><loc>https://www.paritybit.ca/blog/setting-up-a-gopher-site</loc></url> - <url><loc>https://www.paritybit.ca/blog/a-brief-review-of-fedora-32</loc></url> - <url><loc>https://www.paritybit.ca/blog/why-i-love-the-fediverse</loc></url> - <url><loc>https://www.paritybit.ca/blog/submitting-a-bug-report-to-freebsd</loc></url> - <url><loc>https://www.paritybit.ca/blog/cat-v-considered-harmful</loc></url> - <url><loc>https://www.paritybit.ca/blog/unsure-what-to-write</loc></url> - <url><loc>https://www.paritybit.ca/blog/the-joys-of-old-tech</loc></url> - <url><loc>https://www.paritybit.ca/blog/refining-my-neomutt-config</loc></url> - <url><loc>https://www.paritybit.ca/blog/clone-wars-finale</loc></url> - <url><loc>https://www.paritybit.ca/blog/the-diefenbunker-museum</loc></url> - <url><loc>https://www.paritybit.ca/blog/the-disappearance-of-one</loc></url> - <url><loc>https://www.paritybit.ca/blog/caring-about-seo</loc></url> - <url><loc>https://www.paritybit.ca/blog/i-got-more-ram</loc></url> - <url><loc>https://www.paritybit.ca/blog/interesting-things-for-today</loc></url> - <url><loc>https://www.paritybit.ca/blog/how-far-translation-tools-have-come</loc></url> - <url><loc>https://www.paritybit.ca/blog/tweaking-some-css</loc></url> - <url><loc>https://www.paritybit.ca/blog/how-much-ram-is-enough</loc></url> - <url><loc>https://www.paritybit.ca/blog/why-i-blog</loc></url> - <url><loc>https://www.paritybit.ca/blog/decommissioning-my-rackmount-server</loc></url> - <url><loc>https://www.paritybit.ca/blog/housecleaning</loc></url> - <url><loc>https://www.paritybit.ca/blog/logo-redesign</loc></url> - <url><loc>https://www.paritybit.ca/blog/making-my-own-vim-statusline</loc></url> - <url><loc>https://www.paritybit.ca/blog/urxvt-to-st</loc></url> - <url><loc>https://www.paritybit.ca/blog/website-redesign</loc></url> - <url><loc>https://www.paritybit.ca/blog/automating-publishing</loc></url> - <url><loc>https://www.paritybit.ca/blog/arguing-effectively</loc></url> - <url><loc>https://www.paritybit.ca/blog/difficulty-of-privacy-education</loc></url> - <url><loc>https://www.paritybit.ca/blog/qutebrowser-to-firefox</loc></url> - <url><loc>https://www.paritybit.ca/blog/china</loc></url> - <url><loc>https://www.paritybit.ca/links</loc></url> - <url><loc>https://www.paritybit.ca/projects</loc></url> - <url><loc>https://www.paritybit.ca/projects/borderlands-3-dps-calculator</loc></url> - <url><loc>https://www.paritybit.ca/projects/usrmnt</loc></url> - <url><loc>https://www.paritybit.ca/projects/morrowind-character-roller</loc></url> - <url><loc>https://www.paritybit.ca/projects/dnd/roll</loc></url> - <url><loc>https://www.paritybit.ca/projects/dnd/initiative</loc></url> - <url><loc>https://www.paritybit.ca/about</loc></url> - <url><loc>https://www.paritybit.ca/now</loc></url> - <url><loc>https://www.paritybit.ca/contact</loc></url> - <url><loc>https://www.paritybit.ca/uses</loc></url> - <url><loc>https://www.paritybit.ca/about-site</loc></url> - <url><loc>https://www.paritybit.ca/feeds/sitewide-feed.xml</loc></url> -</urlset> diff --git a/public/vid/noswallow-animated-thumb.webm b/public/vid/noswallow-animated-thumb.webm Binary files differ. diff --git a/public/vid/noswallow-animated.webm b/public/vid/noswallow-animated.webm Binary files differ. diff --git a/public/vid/swallow-animated-thumb.webm b/public/vid/swallow-animated-thumb.webm Binary files differ. diff --git a/public/vid/swallow-animated.webm b/public/vid/swallow-animated.webm Binary files differ. diff --git a/publish b/publish @@ -1,265 +0,0 @@ -#!/bin/sh - -# publish -# -# Copyright (C) 2019,2020 Jake Bauer -# -# A utility to publish blog posts to paritybit.ca. -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see \<https://www.gnu.org/licenses/\>. - -# POSIX Shell "Strict Mode" -set -o errexit -set -o nounset -IFS=$(printf '\n\t') - -if [ ! -x "$(command -v rsync)" ]; then - echo "rsync is needed but was not found." - exit 1 -fi -if [ -x "$(command -v nvim)" ]; then - vim_ver="nvim" -elif [ ! -x "$(command -v vim)" ]; then - vim_ver="vim" -else - echo "Either vim or nvim is needed but was not found." - exit 1 -fi -if [ -z "$1" ]; then - echo "No arguments given; nothing to do." - exit 1 -fi - -# Define colours -CLEAR="\033[0m" -RED="\033[0;31m" -GREEN="\033[0;32m" -YELLOW="\033[0;33m" - -# The RSS feed to edit -mainFeed="public/feeds/sitewide-feed.xml" -# Where to upload files -remote="paritybit.ca:uploads/" -# The main base page on the site -baseURL="https://www.paritybit.ca/blog" -# Name of the base page -basePage="blog" -# The path to the compiled base page -categoryPage="html/blog.html" -# Set to false to disable auto uploading files -autoUpload="true" -# Set to false to disable auto posting statuses on Mastodon -autoPost="true" -# Social media API endpoint -socialMediaURL="https://pleroma.paritybit.ca/api/v1/statuses" -# Social media API access token -accessToken="" - -# Prints the message passed as the 1st argument in red. -print_error_msg() -{ - printf "$RED[ee] %s\n$CLEAR" "$1" -} - -# Prints the message passed as the 1st argument in green. -print_success_msg() -{ - printf "$GREEN[ok] %s\n$CLEAR" "$1" -} - -# Prints the message passed as the 1st argument in yellow. -print_header_msg() -{ - printf "$YELLOW[hh] %s\n$CLEAR" "$1" -} - -# Prints the message passed as the 1st argument with default colours. -print_info_msg() -{ - printf "$CLEAR[ii] %s\n" "$1" -} - -# Populate the [DATE] fields of the blog post -populate_date() -{ - print_info_msg "Populating [DATE] fields" - sed -i -e "s/\[DATE\]/$shortDate/g" "$file" - ./compile -n "$file" -} - -# Update the main blog list page -update_base_page() -{ - print_info_msg "Updating base page" - awk -v pt="$pageTitle" -v bp="$basePage" -v f="$fileName" -v d="$shortDate" \ - '{print} /^<ul>/ && !n {print " <li>"d" <a href=\""bp"/"f"\">"pt"</a></li>"; n++}' \ - pages/"$basePage".md > tmp.md && mv tmp.md pages/"$basePage".md - ./compile -n pages/$basePage.md -} - - -# Update the home page to show the new published article and remove oldest entry -update_home_page() -{ - print_info_msg "Updating home page" - sed -i -e "/<\/div>/a\\ -$shortDate \<a class=\"feed-item\" href=\"$basePage\/$fileName\"\>$pageTitle\<\/a\>\n" \ - pages/home.md - echo "/### What is a Parity Bit - 2k2dd - :wq" > /tmp/script.vim - "$vim_ver" -s /tmp/script.vim pages/home.md - ./compile -s -n pages/home.md -} - -create_rss_entry() -{ - print_info_msg "Creating RSS entry" - - # Opening tag - rssEntry="${rssEntry}<item>" - - # Set <title> - rssEntry="${rssEntry} - <title>$pageTitle</title>" - - # Set <link> and <guid> - rssEntry="${rssEntry} - <link>$baseURL/$fileName</link>" - rssEntry="${rssEntry} - <guid>$baseURL/$fileName</guid>" - - # Set pubDate - rssEntry="${rssEntry} - <pubDate>$date</pubDate>" - - # Fill out content - pageContent=$(cat build/blog/"$fileName"-content.html) - rssEntry="${rssEntry} - <description><![CDATA[$pageContent]]></description>" - - # Close the entry - rssEntry="${rssEntry} - </item>" -} - -update_rss_feed() -{ - print_info_msg "Updating RSS feed" - mv "$mainFeed" "$mainFeed.bak" - head -n 8 "$mainFeed.bak" > "$mainFeed" - echo "$rssEntry" >> "$mainFeed" - tail -n +9 "$mainFeed.bak" >> "$mainFeed" -} - -update_sitemap() -{ - print_info_msg "Updating sitemap" - echo "$baseURL" > /tmp/base-url.txt - sed -i -e 's/\//\\\//g' /tmp/base-url.txt - baseURLClean=$(cat /tmp/base-url.txt) - sed -i -e "/$baseURLClean</a\\ - <url\>\<loc\>$baseURLClean\/$fileName\<\/loc\>\<\/url\>" \ - public/sitemap.xml -} - -# Upload the new feed plus the new article and updated pages to the website -auto_upload() -{ - if [ "$autoUpload" != "true" ]; then - return 0 - fi - print_info_msg "Auto-uploading files" - cd public && rsync -rR html/home.html sitemap.xml feeds/sitewide-feed.xml \ - "$categoryPage" "$article" "$remote" && cd .. -} - -# Post a status update on Pleroma linking to the new blog post -auto_post() -{ - if [ "$autoPost" != "true" ]; then - return 0 - fi - - print_info_msg "Generating social media post" - meta="$(head -n3 "$file" | tail -n1 \ - | cut -d'#' -f2 | sed -e 's/^[[:space:]]*//')" - printf "New Blog Post: %s\n\n%s/%s\n\n%s\n\n#100DaysToOffload" \ - "$pageTitle" "$baseURL" "$fileName" "$meta" > /tmp/status.txt - uniqueId="$(md5sum /tmp/status.txt | awk '{print $1}')" - - echo "" - cat /tmp/status.txt - echo "" - - resp="$(curl -s -S -i -X POST \ - -H "Idempotency-Key: $uniqueId" \ - -H "Authorization: Bearer $accessToken" \ - -F status="$(cat /tmp/status.txt)" \ - -F visibility=public \ - "$socialMediaURL")" - httpCode="$(echo "$resp" | grep HTTP/ | awk '{print $2}')" - - if [ "$httpCode" = "200" ]; then - print_success_msg "Successfully posted status update" - else - print_error_msg "ERROR: Failed to post status update" - echo "$resp" - fi -} - -for file in "$@"; do - if [ ! -f "$file" ]; then - print_error_msg "ERROR: File $file not found or is not a file." - continue - fi - - date=$(date +"%a, %d %b %Y %T %z") - shortDate=$(date +"%F") - fileName=$(basename -s .md -- "$file") - pageTitle=$(head -n 1 "$file" | cut -d' ' -f2-) - article="html/blog/$fileName.html" - rssEntry="" - - print_header_msg "PUBLISHING: $file" - - # Thanks to: https://stackoverflow.com/a/27875395/12865517 - printf "Are you sure you wish to publish this post? [y/N]: " - old_stty_cfg=$(stty -g) - stty raw -echo - answer=$( while ! head -c 1 | grep -i '[ny]' ;do true ;done ) - stty "$old_stty_cfg" - if echo "$answer" | grep -iq "^y" ;then - echo "" - print_success_msg "Publishing..." - else - echo "" - print_error_msg "Refusing to publish" - continue - fi - - populate_date - update_base_page - update_home_page - create_rss_entry - update_rss_feed - update_sitemap - auto_upload - auto_post - - print_success_msg "PUBLISHED: $file" - print_success_msg "Visit: $baseURL/$fileName.html" - -done - diff --git a/style/borderlands.css b/style/borderlands.css @@ -1,51 +0,0 @@ -input:not(#tvhm):not(#tvhm2) { - width: 100px; -} - -select { - width: 106px; -} - -.td-label { - text-align: right; - padding-right: 10px; -} - -#grid-container { - display: grid; - grid-gap: 1em; - grid-template-columns: auto auto; - justify-content: center; - align-content: center; -} - -#form-1 { - grid-column: 1; - grid-row: 1; -} - -#form-2 { - grid-column: 2; - grid-row: 1; -} - -#results-1 { - grid-column: 1; - grid-row: 3; -} - -#results-2 { - grid-column: 2; - grid-row: 3; -} - -#calc-button { - grid-column: 1 / span 2; - grid-row: 2; - width: 50%; - margin-left: 25%; -} - -#flesh, #shields, #armour, #flesh2, #shields2, #armour2 { - margin: 0px; -} diff --git a/style/initiative.css b/style/initiative.css @@ -1,53 +0,0 @@ -.initiative-list { - width: 100%; - padding: 1em 0 1em 0; -} - -.initiative-div { - border-radius: 20px; - background-color: var(--input-bg); - margin-bottom: 0.5em; -} - -.initiative-div > * { - display: inline-block; -} - -.in-name { - font-weight: bold; - width: 50%; - padding-left: 1em; -} - -.in-val { - margin-right: 1em; - text-align: center; - font-weight: bold; - width: 10%; -} - -.in-rem-btn, .in-edit-btn { - border-radius: 30px; - margin-right: 2em; -} - -.red-x { - color: var(--unvis-link); -} - -.green-pencil { - color: var(--vis-link); -} - -#add-char > * { - display: inline-block; -} - -@media only screen and (max-width: 750px) { - .in-edit-btn { - margin: 1em 1em 1em 4em; - } - .in-rem-btn { - margin: 1em; - } -} diff --git a/style/main.css b/style/main.css @@ -1,293 +0,0 @@ -:root { - --bg: #25252a; - --fg: #cccccc; - --bg-bright: #36363a; - --fg-bright: #eaeaea; - --fg-dim: #8c8c8c; - --code: #4c4c4c; - --accent: #83b3d8; - --vis-link: #A696CC; - --hov-link: #80ccff; - --notice-bg: #224499; - --border-dark: #585858; - --font-size: 100%; - --small-font: 0.8rem; - --large-font: 1.1rem; - --line-height: 1.3rem; -} - -html { - scrollbar-color: var(--accent) transparent; -} - -body { - background-color: var(--bg); - color: var(--fg); - font-family: "DejaVu Sans", "Open Sans", "Noto Sans", "Roboto", "Droid Sans", sans-serif; - font-size: var(--font-size); - line-height: var(--line-height); - max-width: 40rem; - margin: auto; - padding: 0rem 0.7rem; -} - -h3, h4, h5, h6 { - margin: 2em 0 1em 0; -} - -h2 { - font-style: oblique; - margin-bottom: 0.1em; - line-height: 1.1em; -} - -nav { - text-align: center; -} - -nav a { - padding: 0em 0.5em; - font-size: var(--large-font); - font-weight: bold; - text-decoration: none; -} - -a, nav a:visited { - color: var(--accent); -} - -a:hover, li a:hover, .feed-item:hover, nav a:hover { - color: var(--hov-link) !important; - text-decoration: underline; -} - -a:visited { - color: var(--vis-link); -} - -a:hover { - text-decoration: none; -} - -li a, .feed-item { - text-decoration: none; - font-weight: bold; -} - -s { - color: var(--fg-dim); -} - -img, video { - max-width: 100%; -} - -blockquote { - border-left: 5px solid var(--accent); - border-radius: 10px; - padding-left: 0.5em; -} - -figure { - text-align: center; -} - -figcaption { - margin-bottom: 1.5em; -} - -select, input { - color: var(--fg-bright); - background-color: var(--bg-bright); - border: 2px solid var(--border-dark); - border-radius: 5px; - padding: 0.2em; -} - -select:focus, input:focus { - border: 2px solid var(--accent); -} - -button { - color: var(--fg-bright); - background-color: var(--code); - border: 2px outset var(--border-dark); - border-radius: 5px; - padding: 3px 8px; -} - -button:hover { - border: 2px outset var(--accent); -} - -button:active { - border: 2px inset var(--border-dark); -} - -table, th, td { - border: 2px solid var(--border-dark); - border-collapse: collapse; - text-align: left; - padding: 0.25em 0.5em; -} - -th { - color: var(--fg-bright); - background-color: var(--bg-bright); -} - -.badge { - display: inline-block; - margin: 5px; -} - -.byline { - font-size: var(--small-font); -} - -.eff-banner { - float: right; - width: 75px; - height: 75px; -} - -.debian-banner { - float: left; - width: 68px; - height: 85px; -} - -.rss-icon { - display: inline-block; - margin-left: 0.5em; -} - -.rss-icon img { - width: 1rem; - height: 1rem; -} - -.feed-wrapper { - margin-bottom: -1em; -} - -.feed-title { - display: inline-block; -} - -.note { - background-color: var(--notice-bg); - color: var(--fg-bright); - border-radius: 5px; - box-shadow: 4px 4px 5px 0px rgba(0,0,0,0.5); - padding: 20px 30px; - margin: auto; -} - -.note a, .note a:visited{ - color: var(--fg-bright); - text-decoration: underline; -} - -#header { - text-align: center; - clear: both; - margin: 1em auto; - font-size: var(--large-font); -} - -#table-of-contents { - float: right; - margin: 0em 0em 1em 1em; - width: 45%; - border: 2px var(--border-dark) solid; - border-radius: 5px; - background-color: var(--bg-bright); -} - -#toc-title { - font-size: var(--large-font); - font-weight: bold; - padding-left: 1em; -} - -#footer { - clear: both; -} - -#footer > p { - text-align: center; - font-size: var(--small-font); - padding: 0em 6em; -} - -@media print { - body { - font-size: 16px; - } - pre { - white-space: pre-wrap; - } -} -@media only screen and (max-width: 600px) { - #table-of-contents { - width: 70%; - float: none; - margin: auto; - margin-top: 1.5em; - } -} - -/* Syntax highlighting */ -pre { - background-color: var(--code); - overflow: auto; - padding: 1em; - border: 2px var(--border-dark) solid; - border-radius: 5px; - text-indent: -0.25em; /*Needed otherwise first line indented for some reason*/ -} - -code { - font-family: "DejaVu Sans Mono", monospace; - background-color: var(--code); - color: var(--fg-bright); - font-size: var(--small-font); - padding: 1px 4px; - border-radius: 5px; -} - -code a, code a:hover { - color: var(--fg-bright) !important; -} - -/* Colours taken from pandoc .theme files with extra tweaks */ -code span.al { color: #fba5a2; } /* Alert */ -code span.an { color: var(--fg); font-weight: bold; } /* Annotation */ -code span.at { color: var(--fg-bright); } /* Attribute */ -code span.bn { color: #beb8d5; } /* BaseN */ -code span.bu { color: #bac17c; } /* BuiltIn */ -code span.cf { color: #9dbfe4; } /* ControlFlow */ -code span.ch { color: #beb8d5; } /* Char */ -code span.cn { color: #beb8d5; font-weight: bold; } /* Constant */ -code span.co { color: var(--fg); font-style: italic; } /* Comment */ -code span.cv { color: var(--fg); font-weight: bold; font-style: italic; } /* CommentVar */ -code span.do { color: var(--fg); font-style: italic; } /* Documentation */ -code span.dt { color: #e4b285; } /* DataType */ -code span.dv { color: #beb8d5; } /* DecVal */ -code span.er { color: #fba5a2; } /* Error */ -code span.ex { color: #bac17c; } /* Extension */ -code span.fl { color: #beb8d5; } /* Float */ -code span.fu { color: #e4b285; } /* Function */ -code span.im { color: var(--fg-bright); } /* Import */ -code span.in { color: var(--fg); font-weight: bold; } /* Information */ -code span.kw { color: #9dbfe4; font-weight: bold; } /* Keyword */ -code span.op { color: var(--fg-bright); } /* Operator */ -code span.ot { color: #9dbfe4; } /* Other */ -code span.pp { color: #bac17c; font-weight: bold; } /* Preprocessor */ -code span.sc { color: #e4b285; } /* SpecialChar */ -code span.ss { color: #88c6cd; } /* SpecialString */ -code span.st { color: #88c6cd; } /* String */ -code span.va { color: #bac17c; } /* Variable */ -code span.vs { color: #88c6cd; } /* VerbatimString */ -code span.wa { color: var(--fg); font-weight: bold; } /* Warning */ diff --git a/style/morrowind.css b/style/morrowind.css @@ -1,94 +0,0 @@ -#grid-container { - display: grid; - grid-template-columns: auto auto; - justify-content: center; - align-content: center; -} - -#lfn { - grid-column: 1; - grid-row: 1; - margin: 0; -} - -#lff1 { - grid-column: 1; - grid-row: 2; -} - -#lff2 { - grid-column: 1; - grid-row: 3; -} - -#lcf { - grid-column: 1; - grid-row: 4; -} - -#lhf { - grid-column: 1; - grid-row: 5; -} - -#lbf { - grid-column: 1; - grid-row: 6; -} - -#lrf { - grid-column: 1; - grid-row: 7; -} - -#genButton { - grid-column: 2; - grid-row: 8; - margin-top: 0.5em; -} - -#afn { - grid-column: 2; - grid-row: 1; -} - -#factionField1 { - grid-column: 2; - grid-row: 2; -} - -#factionField2 { - grid-column: 2; - grid-row: 3; -} - -#classField { - grid-column: 2; - grid-row: 4; -} - -#hometownField { - grid-column: 2; - grid-row: 5; -} - -#birthsignField { - grid-column: 2; - grid-row: 6; -} - -#raceField { - grid-column: 2; - grid-row: 7; -} - -.fieldTitle { - font-weight: bold; - padding: 0 1em 0 0; - text-align: right; - margin-top: 0.2em; -} - -.charField { - width: 16em; -} diff --git a/style/roll.css b/style/roll.css @@ -1,207 +0,0 @@ -input:not(#inputString) { - width: 4em; -} - -.field { - font-weight: bold; - margin: 0 0 0 0.8em; - padding-top: 0.3em; -} - -#grid-container { - display: grid; - grid-template-columns: auto auto auto auto auto; - justify-content: left; - grid-gap: 0.2em; -} - -#history { - position: relative; - grid-column: 5; - grid-row: 2 / span 7; -} - -#history-text { - display: inline-block; - margin: 1em; - float: left; - width: 100%; - color: var(--fg-alt); - background-color: var(--bg-alt); -} - -#clear-history { - position: absolute; - margin-left: 1em; - margin-bottom: 1em; - bottom: 1px; - left: 1px; -} - -#die-header { - grid-column: 1; - grid-row: 1; -} - -#num-header { - grid-column: 2; - grid-row: 1; -} - -#mod-header { - grid-column: 3; - grid-row: 1; -} - -#res-header { - grid-column: 4; - grid-row: 1; -} - -#d4 { - grid-column: 1; - grid-row: 2; -} - -#d6 { - grid-column: 1; - grid-row: 3; -} - -#d8 { - grid-column: 1; - grid-row: 4; -} - -#d10 { - grid-column: 1; - grid-row: 5; -} - -#d12 { - grid-column: 1; - grid-row: 6; -} - -#d20 { - grid-column: 1; - grid-row: 7; -} - -#d100 { - grid-column: 1; - grid-row: 8; -} - -#num4 { - grid-column: 2; - grid-row: 2; -} - -#num6 { - grid-column: 2; - grid-row: 3; -} - -#num8 { - grid-column: 2; - grid-row: 4; -} - -#num10 { - grid-column: 2; - grid-row: 5; -} - -#num12 { - grid-column: 2; - grid-row: 6; -} - -#num20 { - grid-column: 2; - grid-row: 7; -} - -#num100 { - grid-column: 2; - grid-row: 8; -} - -#mod4 { - grid-column: 3; - grid-row: 2; -} - -#mod6 { - grid-column: 3; - grid-row: 3; -} - -#mod8 { - grid-column: 3; - grid-row: 4; -} - -#mod10 { - grid-column: 3; - grid-row: 5; -} - -#mod12 { - grid-column: 3; - grid-row: 6; -} - -#mod20 { - grid-column: 3; - grid-row: 7; -} - -#mod100 { - grid-column: 3; - grid-row: 8; -} - -#d4result { - grid-column: 4; - grid-row: 2; -} - -#d6result { - grid-column: 4; - grid-row: 3; -} - -#d8result { - grid-column: 4; - grid-row: 4; -} - -#d10result { - grid-column: 4; - grid-row: 5; -} - -#d12result { - grid-column: 4; - grid-row: 6; -} - -#d20result { - grid-column: 4; - grid-row: 7; -} - -#d100result { - grid-column: 4; - grid-row: 8; -} - -@media only screen and (max-width: 680px) { - #history { - position: relative; - grid-column: 1 / span 4; - grid-row: 9; - } -} diff --git a/style/tdc.css b/style/tdc.css @@ -1,66 +0,0 @@ -input { - max-width: 4em; - margin-bottom: 0.5em; -} - -button { - margin-top: 0.5em; -} - -#grid-container p { - margin: 0; -} - -#grid-container { - display: grid; - grid-gap: 1em; - grid-template-columns: 5em auto; - margin-top: 1em; -} - -#duration-label, -#hours-label, -#minutes-label, -#seconds-label { - grid-column: 1; - text-align: right; -} - -#duration-label { - grid-row: 1; -} - -#hours-label { - grid-row: 2; -} - -#minutes-label { - grid-row: 3; -} - -#seconds-label { - grid-row: 4; -} - -#result-field, -#result-field-hours, -#result-field-minutes, -#result-field-seconds { - grid-column: 2; -} - -#result-field { - grid-row: 1; -} - -#result-field-hours { - grid-row: 2; -} - -#result-field-minutes { - grid-row: 3; -} - -#result-field-seconds { - grid-row: 4; -} diff --git a/tuptime-update.pl b/tuptime-update.pl @@ -1,61 +0,0 @@ -#!/bin/perl - -use strict; -use warnings; -use HTML::TreeBuilder; -use File::Copy qw(copy move); - -# Copy about-site file so we can work on it without disturbing live copy -copy '/var/www/html/about-site.html', './about-site.html'; -my $outfile = './about-site.html.new'; -my $infile = './about-site.html'; - -# Open both infile and outfile for reading/writing respectively -open(my $fh, '<:encoding(UTF-8)', $infile) - or die "Could not open file '$infile' $!"; -open my $out, '>', "$outfile" or die "Can't write new file: $!"; - -# Run the tuptime command to get output for putting into outfile -my $cmd = "tuptime"; -my @output = `$cmd`; -chomp @output; - -# Look through each line of the infile, write the line to outfile unless we are -# in between <pre></pre> in which case write out the output of tuptime. -my $inPreFlag = 0; -my $arrIndex = 0; -while (my $row = <$fh>) { - chomp $row; - # Create a new HTML tree to parse HTML tags from $row - my $tr = HTML::TreeBuilder->new_from_content($row); - - # If this line contains a <pre> tag, set the proper flag to begin printing - # output from tuptime. - if ($tr->find_by_tag_name('pre')) { - $inPreFlag = 1; - print "Entering pre\n"; - print $out "<pre><code>"; - next; - } - # Check if we have printed out every line from the output of tuptime - if ($arrIndex == scalar @output) { - # Reset arrIndex so the above doesn't continue to resolve to true - $arrIndex = 0; - $inPreFlag = 0; - print "Exiting pre\n"; - print $out "</code></pre>\n"; - } - - if ($inPreFlag) { - print $out "$output[$arrIndex]\n"; - $arrIndex++; - } - else { - print $out "$row\n"; - } -} - -# Finally, overwrite the old about-site file with this new one: -move './about-site.html.new', '/var/www/html/about-site.html'; -# And remove the copy of the old one -unlink('./about-site.html'); diff --git a/uploadwatch.sh b/uploadwatch.sh @@ -1,9 +0,0 @@ -#!/bin/bash - -DESTDIR=/var/www/ -WATCHDIR=/home/manager/uploads/ - -mkdir -p "$WATCHDIR" -touch /home/manager/upload.log - -find "$WATCHDIR" -mindepth 1 -maxdepth 1 -exec sh -c 'if [ ! "$1" = "" ]; then echo "==========" >> /home/manager/upload.log && rsync -vr "$1" "$2" >> /home/manager/upload.log && rm -r $1 && chown -R www-data:www-data "$2"; fi' - {} "$DESTDIR" \;