Browse Source

Merge branch 'go'

master
Noah Petherbridge 3 years ago
parent
commit
7688004234
93 changed files with 8724 additions and 7517 deletions
  1. +1
    -0
      .gitignore
  2. +24
    -9
      README.md
  3. +0
    -82
      bootstrap.py
  4. +4
    -0
      conf/apache.conf
  5. +2
    -1
      conf/nginx.conf
  6. +0
    -127
      kirsle_legacy.py
  7. +62
    -67
      www/.layout.gohtml
  8. +6
    -15
      www/about.gohtml
  9. +0
    -28
      www/blog/categories.inc.html
  10. +20
    -0
      www/blog/tags.partial.gohtml
  11. +7
    -38
      www/contact/index.gohtml
  12. +0
    -442
      www/css/bootstrap-theme.css
  13. +0
    -1
      www/css/bootstrap-theme.css.map
  14. +0
    -5
      www/css/bootstrap-theme.min.css
  15. +0
    -6203
      www/css/bootstrap.css
  16. +0
    -1
      www/css/bootstrap.css.map
  17. +0
    -5
      www/css/bootstrap.min.css
  18. +3
    -4
      www/designs/index.gohtml
  19. +49
    -0
      www/download.gohtml
  20. +0
    -44
      www/download.html
  21. +3
    -4
      www/errorgen.gohtml
  22. +15
    -46
      www/firered.gohtml
  23. +21
    -0
      www/flash/aichaos-warners.gohtml
  24. +0
    -15
      www/flash/aichaos-warners.html
  25. +0
    -12
      www/flash/flash-common.html
  26. +3
    -4
      www/flash/index.gohtml
  27. +20
    -0
      www/flash/kanian-azulian-war.gohtml
  28. +0
    -14
      www/flash/kanian-azulian-war.html
  29. +20
    -0
      www/flash/pwnizard-i-choose-you.gohtml
  30. +0
    -14
      www/flash/pwnizard-i-choose-you.html
  31. +3
    -4
      www/fonts.gohtml
  32. +0
    -33
      www/google-ads.inc.html
  33. +8
    -0
      www/guestbook.gohtml
  34. +0
    -13
      www/guestbook.html
  35. +4
    -6
      www/index.gohtml
  36. +4
    -5
      www/javascript.gohtml
  37. +4
    -9
      www/msdos.gohtml
  38. +3
    -4
      www/pccc.gohtml
  39. +4
    -8
      www/raspberrypi.gohtml
  40. +4
    -5
      www/rendering.gohtml
  41. +3
    -4
      www/rivescript.gohtml
  42. +46
    -46
      www/solar/monokai.css
  43. +47
    -191
      www/solar/ui.css
  44. +3
    -4
      www/start.gohtml
  45. +3
    -4
      www/tkcalc.gohtml
  46. +34
    -0
      www/vendor/FontAwesome/LICENSE.txt
  47. +7
    -0
      www/vendor/FontAwesome/README.md
  48. +343
    -0
      www/vendor/FontAwesome/css/fa-svg-with-js.css
  49. +446
    -0
      www/vendor/FontAwesome/js/fa-brands.js
  50. +5
    -0
      www/vendor/FontAwesome/js/fa-brands.min.js
  51. +237
    -0
      www/vendor/FontAwesome/js/fa-regular.js
  52. +5
    -0
      www/vendor/FontAwesome/js/fa-regular.min.js
  53. +587
    -0
      www/vendor/FontAwesome/js/fa-solid.js
  54. +5
    -0
      www/vendor/FontAwesome/js/fa-solid.min.js
  55. +88
    -0
      www/vendor/FontAwesome/js/fa-v4-shims.js
  56. +5
    -0
      www/vendor/FontAwesome/js/fa-v4-shims.min.js
  57. +3040
    -0
      www/vendor/FontAwesome/js/fontawesome-all.js
  58. +5
    -0
      www/vendor/FontAwesome/js/fontawesome-all.min.js
  59. +1782
    -0
      www/vendor/FontAwesome/js/fontawesome.js
  60. +5
    -0
      www/vendor/FontAwesome/js/fontawesome.min.js
  61. +12
    -0
      www/wiki.gohtml
  62. +290
    -0
      www/wiki/Bookmarks.md
  63. +17
    -0
      www/wiki/Breath-of-the-Wild-Challenge-Run.md
  64. +21
    -0
      www/wiki/Built-with-RiveScript.md
  65. +57
    -0
      www/wiki/Common-ffmpeg-commands.md
  66. +89
    -0
      www/wiki/Debian-on-Macbook.md
  67. +15
    -0
      www/wiki/Fedora-Dependencies-for-Ubuntu-Projects.md
  68. +70
    -0
      www/wiki/Fedora-NetworkManager-OpenVPN.md
  69. +93
    -0
      www/wiki/Fedora-on-Macbook.md
  70. +7
    -0
      www/wiki/FollowingSync-Privacy-Policy.md
  71. +73
    -0
      www/wiki/Future-Project-Ideas.md
  72. +13
    -0
      www/wiki/Go-QT5-Installation.md
  73. +49
    -0
      www/wiki/IPv6-on-Linux.md
  74. +27
    -0
      www/wiki/Main-Page.md
  75. +57
    -0
      www/wiki/Minecraft-Clone.md
  76. +82
    -0
      www/wiki/Minecraft-vs-Terraria-Account-Models.md
  77. +105
    -0
      www/wiki/Optimize-RiveScript.md
  78. +58
    -0
      www/wiki/PowerTOP-and-USB-Autosuspend.md
  79. +58
    -0
      www/wiki/Protocol-Buffers-Protocol.md
  80. +74
    -0
      www/wiki/Publishing-RiveScript-Modules.md
  81. +22
    -0
      www/wiki/Python-cocos2d-Installation.md
  82. +74
    -0
      www/wiki/Python-for-RiveScript-Go.md
  83. +12
    -0
      www/wiki/Python-on-Mac-OS-X-Tips.md
  84. +7
    -0
      www/wiki/Resetting-Modal-Bluetooth-Headphones.md
  85. +32
    -0
      www/wiki/RiveScript-Discussions.md
  86. +5
    -0
      www/wiki/September-Links.md
  87. +3
    -0
      www/wiki/TMP.md
  88. +34
    -0
      www/wiki/Tasker-OpenVPN-Connect.md
  89. +7
    -0
      www/wiki/Test-Page.md
  90. +74
    -0
      www/wiki/Things-Learned-with-jQuery-Mobile.md
  91. +35
    -0
      www/wiki/Time-Travel.md
  92. +57
    -0
      www/wiki/Unicode-Problems.md
  93. +105
    -0
      www/wiki/nginx-configs.md

+ 1
- 0
.gitignore View File

@@ -1,5 +1,6 @@
/prod.yml
/db
/www/.private
/rophako
/www/static/photos/*.jpg
/www/static/photos/*.png


+ 24
- 9
README.md View File

@@ -2,22 +2,37 @@

![Kirsle](https://raw.githubusercontent.com/kirsle/kirsle.net/master/www/solar/kirsle.png)

This is the source code of my personal website,
[Kirsle.net](http://www.kirsle.net/). It runs on top of my Python CMS called
[Rophako](https://github.com/kirsle/rophako).
This is the source code of my personal website, [Kirsle.net][1]. It runs on
top of my Go blog application, [kirsle/blog][2].

This Git repo only contains templates and design files for the main Kirsle.net
website. This means only the files that are served directly by the Python CMS
website. This means only the files that are served directly by the Go CMS
(all pages with the "solar" web design) are here; but there are a decently
large number of static files and one-off CGI scripts that get served directly
by nginx instead. For example the `projects/` folder where I keep downloads of
my various software projects, and the `creativity/` and `wizards` folders.
my various software projects, and the `creativity/` and `wizards/` folders.

So, feel free to look around in this repo, but you won't find anything too
interesting in here. It's mostly just Jinja2 HTML templates and the odd web
design file (CSS, JS, and some images).
interesting in here. It's mostly just Go HTML templates, Markdown pages, and the
odd web design file (CSS, JS, and some images).

For the version of Kirsle.net that ran on my Python CMS, [Rophako][3], check
out the `rophako` branch of this repo.

## Dev Environment Quick Start

Run `bootstrap.py` to automatically clone and configure the Rophako CMS to run
a local dev instance of Kirsle.net.
```bash
# Make sure you have a Go environment set up. Quickly:
export GOPATH="${HOME}/go"
export PATH="${PATH}:${GOPATH}/bin"

# Install my Go blog
go get github.com/kirsle/blog/...

# Run it on the kirsle.net www folder.
blog ./www
```

[1]: https://www.kirsle.net/
[2]: https://github.com/kirsle/blog
[3]: https://github.com/kirsle/rophako

+ 0
- 82
bootstrap.py View File

@@ -1,82 +0,0 @@
#!/usr/bin/env python3

"""Bootstrap script to set up a local dev instance of Kirsle.net

This will `git clone` an instance of the Rophako CMS and configure it to run
this local website. When the dev Rophako instance already exists, running this
script again acts as a shortcut to running `python runserver.py` from within
the Rophako git repo.

This script is only designed to work in Python 3 and requires the `git` and
`pyvenv` commands.

This performs the following tasks:
* Clones Rophako into ./rophako
* Sets up a Python 3 virtual environment via `pyvenv` at ./rophako/pyvenv
* Installs requirements via `pip` into its virtual environment
* Symlinks settings.yml and kirsle_legacy.py into the Rophako root
* Runs the server
"""

import os
import os.path
import subprocess
import sys

def main():
# Make sure we have everything we need.
check_depends()

# Do we already have Rophako?
if os.path.isdir("./rophako"):
os.chdir("./rophako")
else:
# Clone it.
must_run(["git", "clone", "https://github.com/kirsle/rophako"])
os.chdir("./rophako")

# Make the Python environment.
must_run(["pyvenv", "pyvenv"])
must_run(["pyvenv/bin/pip", "install", "-r", "requirements.txt"])

# Configure it.
os.symlink("../settings.yml", "settings.yml")
os.symlink("../kirsle_legacy.py", "kirsle_legacy.py")

print("=" * 80)
print("Success! Rophako has been cloned and configured! The server")
print("will now start. To quickly start the server again in the")
print("future, just run bootstrap.py again.")
print("=" * 80)

# Run Rophako.
must_run(["pyvenv/bin/python", "runserver.py"])

def check_depends():
# Make sure we have access to required commands.
errors = False
for command in [ "git", "pyvenv" ]:
try:
subprocess.check_call(["which", command],
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
)
except subprocess.CalledProcessError:
print("You seem to be missing the command: {}".format(command))
errors = True

if errors:
print("Make sure the required commands are installed and try again.")
sys.exit(1)

def must_run(args, **kwargs):
"""Calls subprocess to run a command which must succeed or die."""
result = subprocess.call(args, **kwargs)
if result != 0:
print("Errors were detected in the command I tried to run: {}".format(
" ".join(args),
))
sys.exit(1)

if __name__ == "__main__":
main()

apache.conf → conf/apache.conf View File

@@ -1,3 +1,7 @@
# Apache config from when kirsle.net ran on Apache.
#
# This is for a Python mod_wsgi site.

## SSL main site www.kirsle.net
<VirtualHost *:443>
ServerName www.kirsle.net

nginx.conf → conf/nginx.conf View File

@@ -1,3 +1,5 @@
# nginx config for kirsle.net

server {
server_name www.kirsle.net;
listen 443 ssl;
@@ -96,4 +98,3 @@ server {

return 301 https://www.kirsle.net$request_uri;
}


+ 0
- 127
kirsle_legacy.py View File

@@ -1,127 +0,0 @@
# -*- coding: utf-8 -*-

# Legacy endpoint compatibility from kirsle.net.

from flask import g, request, redirect, url_for, flash
import re
import os
import json

from rophako.settings import Config
from rophako.app import app
from rophako.utils import template, login_required
import rophako.model.blog as Blog
import rophako.jsondb as JsonDB


@app.route("/+")
def google_plus():
return redirect("https://plus.google.com/+NoahPetherbridge/posts")


@app.route("/blog.html")
def ancient_legacy_blog():
post_id = request.args.get("id", None)
if post_id is None:
return redirect(url_for("blog.index"))

# Look up the friendly ID.
post = Blog.get_entry(post_id)
if not post:
flash("That blog entry wasn't found.")
return redirect(url_for("blog.index"))

return redirect(url_for("blog.entry", fid=post["fid"]), code=301)


@app.route("/blog/kirsle/<fid>")
def legacy_blog(fid):
return redirect(url_for("blog.entry", fid=fid), code=301)


@app.route("/rss.cgi")
def legacy_rss():
return redirect(url_for("blog.rss"), code=301)


@app.route("/firered/<page>")
@app.route("/firered")
def legacy_firered(page=""):
g.info["page"] = str(page) or "1"
return template("firered.html")


@app.route("/download", methods=["GET", "POST"])
def legacy_download():
form = None
if request.method == "POST":
form = request.form
else:
# CNET links to the MS-DOS download using semicolon delimiters in the
# query string. Fix that if detected.
query = request.query_string.decode()
if not '&' in query and ';' in query:
url = re.sub(r';|%3b', '&', request.url, flags=re.IGNORECASE)
return redirect(url)

form = request.args

method = form.get("method", "index")
project = form.get("project", "")
filename = form.get("file", "")

root = "/home/kirsle/www/projects"

if project and filename:
# Filter the sections.
project = re.sub(r'[^A-Za-z0-9]', '', project) # Project name is alphanumeric only.
filename = re.sub(r'[^A-Za-z0-9\-_\.]', '', filename)

# Check that all the files exist.
if os.path.isdir(os.path.join(root, project)) and os.path.isfile(os.path.join(root, project, filename)):
# Hit counters.
hits = { "hits": 0 }
db = "data/downloads/{}-{}".format(project, filename)
if JsonDB.exists(db.format(project, filename)):
hits = JsonDB.get(db)

# Actually getting the file?
if method == "get":
# Up the hit counter.
hits["hits"] += 1
JsonDB.commit(db, hits)

g.info["method"] = method
g.info["project"] = project
g.info["file"] = filename
g.info["hits"] = hits["hits"]
return template("download.html")

flash("The file or project wasn't found.")
return redirect(url_for("index"))


@app.route("/<page>.html")
def legacy_url(page):
return redirect("/{}".format(page), code=301)


@app.route("/metacity")
def legacy_metacity():
return redirect("https://github.com/kirsle/linux-themes", code=301)


@app.route("/ssl_test")
@login_required
def ssl_test():
return "<pre>{}</pre>".format(json.dumps({
"SSLify criteria": {
"request.is_secure": request.is_secure,
"app.debug": app.debug,
"X-Forwarded-Proto is http": request.headers.get("X-Forwarded-Proto", "http") == "https",
},
"App Configuration": {
"Session cookies secure": app.config["SESSION_COOKIE_SECURE"],
"config.FORCE_SSL": Config.security.force_ssl,
},
}))

www/layout.html → www/.layout.gohtml View File

@@ -1,14 +1,20 @@
{{ define "title" }}{{ end }}
{{ define "scripts" }}{{ end }}

{{ define "layout" }}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>{% block title %}{% endblock %} - Kirsle.net</title>
<title>{{ template "title" . }} - {{ .Title }}</title>

<!-- Bootstrap -->
<link rel="stylesheet" type="text/css" href="/css/bootstrap.min.css">
<link rel="stylesheet" type="text/css" href="/css/bootstrap-theme.min.css">

<!-- FontAwesome -->
<link rel="stylesheet" type="text/css" href="/vendor/FontAwesome/css/fa-svg-with-js.css">

<!-- Kirsle.net Solar -->
<link rel="stylesheet" type="text/css" media="screen" href="/solar/ui.css">
@@ -19,68 +25,73 @@
</head>
<body>

{% from "google-ads.inc.html" import leaderboard, nav_ads %}

<div class="mobile-nav">
<a href="#navbar" class="btn btn-primary"><i class="glyphicon glyphicon-list"></i></a>
<a href="#navbar" class="btn btn-primary"><i class="fas fa-bars"></i></a>
</div>

<div class="k-supernova"></div>

<div class="container-fluid">

<div class="row">
<div class="col-md-4 col-md-offset-3">
<div class="col-12 col-lg-10 col-xl-8">
<div class="k-kirsle" onclick="self.location='/'"></div>
</div>
</div>

<div class="row">

<div class="col-sm-10 col-sm-push-2">
<div class="k-content-panel">
{% with messages = get_flashed_messages() %}
{% if messages %}
<h1>Notice!</h1>
<div class="order-1 order-lg-12 col-12 col-lg-10 col-xl-8">
<div class="k-content-panel mb-4">
{{ if .SetupNeeded }}
<div class="alert alert-success">
Your web blog needs to be set up!
Please <a href="/initial-setup">click here</a> to
configure your blog.
</div>
{{ end }}

<ul>
{% for message in messages %}
<li>{{ message }}</li>
{% endfor %}
</ul>
{% endif %}
{% endwith %}
{{ range .Flashes }}
<div class="alert alert-success">
{{ . }}
</div>
{{ end }}

{% block content %}{% endblock %}
{{ if .Error }}
<div class="alert alert-danger">
<strong>Error:</strong> {{ .Error }}
</div>
{{ end }}

{{ template "content" . }}

{% if uri not in ["/", "/blog/index"] and not "/blog/category" in uri %}
<br><br>
{{ leaderboard() }}
{% endif %}
{{ if and .CurrentUser.Admin .Editable }}
<p>
<strong>Admin:</strong> [<a href="/admin/editor?file={{ or .Data.MarkdownFile TemplateName }}">edit this page</a>]
</p>
{{ end }}

<div class="k-copyright">
Copyright &copy; {{ strftime("%Y") }} Noah Petherbridge &mdash; All rights reserved<br>
Powered by <a href="http://rophako.kirsle.net/" target="_blank">{{ app["name"] }}</a> v{{ app["version"] }} -
Copyright &copy; {{ Now.Format "2006" }} Noah Petherbridge &mdash; All rights reserved<br>
Hosted by <a href="https://www.digitalocean.com/?refcode=ea01734d3fc7">DigitalOcean</a><br>
Page generated in %time_elapsed%s.
Page generated in {{ printf "%.4f" .RequestDuration.Seconds }}s.
</div>
</div>
</div>

<div class="col-sm-2 col-sm-pull-10">
<div class="k-navpanel" id="navbar">
<div class="order-12 order-lg-1 col-12 col-lg-2">
<div class="k-navpanel mb-4" id="navbar">
<div class="k-section">Kirsle</div>
<ul>
<li>&#0187; <a href="/">Homepage</a> (<a href="{{ url_for('blog.rss') }}">RSS</a>)</li>
<li>&#0187; <a href="/">Homepage</a> (<a href="/blog.rss">RSS</a>)</li>
<li>&#0187; <a href="/about">About Me</a></li>
<li>&#0187; <a href="/photos/albums">Photo Albums</a></li>
<!-- <li>&#0187; <a href="/photos/albums">Photo Albums</a></li> -->
<li>&#0187; <a href="/wiki/Main-Page">Wiki</a></li>
<li>&#0187; <a href="/guestbook">Guestbook</a></li>
<li>&#0187; <a href="/contact">Contact Me</a></li>
</ul>

<div class="k-section">Channels</div>
{{ include_page("blog.partial_tags")|safe }}
<div class="k-section">Blog Tags</div>
{{ RenderTags .Request false }}

<div class="k-section">Creativity</div>
<ul>
@@ -139,31 +150,24 @@
<li>&#0187; <a href="https://www.npmjs.org/~kirsle" rel="me">npm</a></li>
</ul>

<br>
{{ nav_ads() }}
<br>

<div class="k-section">Fan Club</div>
<ul>
{% if session["login"] %}
<li>&#0164; Hi, <big>{{ session["name"] }}</big></li>
{% if session["role"] == "admin" %}
<li>&#0187; <a href="{{ url_for('admin.index') }}">Admin Center</a></li>
{% endif %}
<li>&#0187; <a href="{{ url_for('blog.update') }}">Update Blog</a></li>
<li>&#0187; <a href="{{ url_for('blog.drafts') }}">Drafts</a>/<a href="{{ url_for('blog.private') }}">Private</a></li>
{% if "impersonator" in session %}
<li>&#0187; <a href="{{ url_for('admin.unimpersonate') }}">Unimpersonate</a></li>
{% endif %}
<li>&#0187; <a href="{{ url_for('account.logout') }}">Log Out</a>
{% else %}
<li id="login-link">&#0187; <a href="{{ url_for('account.login') }}" class="login-link">Log In</a></li>
{% endif %}
{{ if .LoggedIn }}
<li>&#0164; Hi, <big><a href="/account">{{ or .CurrentUser.Name .CurrentUser.Username }}</a></big></li>
{{ if .CurrentUser.Admin }}
<li>&#0187; <a href="/admin">Admin Center</a></li>
{{ end }}
<li>&#0187; <a href="/blog/edit">Update Blog</a></li>
<li>&#0187; <a href="/blog/drafts">Drafts</a>/<a href="/blog/private">Private</a></li>
<li>&#0187; <a href="/logout">Log Out</a>
{{ else }}
<li id="login-link">&#0187; <a href="/login" class="login-link">Log In</a></li>
{{ end }}
</ul>
<div id="login-inline" style="display: none">
<form action="{{ url_for('account.login') }}" method="POST">
<input type="hidden" name="token" value="{{ csrf_token() }}">
<input type="hidden" name="url" value="{{ request.path }}">
<form action="/login" method="POST">
<input type="hidden" name="_csrf" value="{{ .CSRF }}">
<input type="hidden" name="next" value="{{ .Path }}">
<input type="text" class="form-control" size="4" name="username" style="display: inline; width: 45%">
<input type="password" class="form-control" size="4" name="password" style="display: inline; width: 45%">
<br>
@@ -199,6 +203,7 @@
<script type="text/javascript" src="/js/jquery-2.1.0.min.js"></script>
<script type="text/javascript" src="/js/offsite.js"></script>
<script type="text/javascript" src="/js/bootstrap.min.js"></script>
<script type="text/javascript" src="/vendor/FontAwesome/js/fontawesome-all.min.js"></script>
<script type="text/javascript">
$(document).ready(function() {
$(".login-link").click(function() {
@@ -208,19 +213,9 @@
});
});
</script>
{% block scripts %}{% endblock %}

<!-- Google Analytics -->
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');

ga('create', 'UA-27498092-1', 'kirsle.net');
ga('require', 'displayfeatures');
ga('send', 'pageview');
</script>

{{ template "scripts" }}

</body>
</html>
{{ end }}

www/about.html → www/about.gohtml View File

@@ -1,28 +1,19 @@
{% extends "layout.html" %}
{% block title %}About Me{% endblock %}
{% block content %}
{{ define "title" }}About Me{{ end }}
{{ define "content" }}

<h1>About Me</h1>

<div class="row">
<div class="col-lg-2">
<div class="col-2 markdown">
<img src="/static/photos/ff7ec4f5.jpg" class="img-responsive portrait" alt="Kirsle"><p>

<img src="/static/icons/aim.gif" width="16" height="15" alt="AIM">
<strong>AIM:&nbsp;&nbsp;&nbsp;</strong>
<a href="aim:goim?ScreenName=Kirsle">Kirsle</a><br>

<img src="/static/icons/xmpp.gif" width="16" height="16" alt="XMPP">
<strong>XMPP:</strong>
kirsle@kirsle.net<p>

&#0164; <a href="/contact">Send me an e-mail</a>
</div>

<div class="col-lg-10">
<div class="col-10">
<h2>Hello world!</h2>

My name is <strong>Noah</strong> and this is my website. I am a 29-year-old software
My name is <strong>Noah</strong> and this is my website. I am a 30-year-old software
engineer who lives in Los Angeles. My areas of expertise are primarily in Perl and
Python back-end software development, however I believe I have a knack for the front
end as well.<p>
@@ -87,4 +78,4 @@
</div>
</div>

{% endblock %}
{{ end }}

+ 0
- 28
www/blog/categories.inc.html View File

@@ -1,28 +0,0 @@
{# Custom category list for kirsle.net <ul>-based design #}
<ul>
<li>&#0187; <a href="{{ url_for('blog.archive') }}">Blog Archives</a></li>
{% for tag in tags %}
{% if not tag["small"] %}
<li>&#0187; <a href="{{ url_for('blog.category', category=tag['category']) }}">{{ tag['category'] }}</a>
<small>({{ tag['count'] }})</small></li>
{% endif %}
{% endfor %}
</ul>

{% if has_small %}
<div id="blog_show_more" style="display: none">
<ul>
{% for tag in tags %}
{% if tag["small"] %}
<li>&#0187; <a href="{{ url_for('blog.category', category=tag['category']) }}">{{ tag['category'] }}</a>
<small>({{ tag['count'] }})</small></li>
{% endif %}
{% endfor %}
</ul>
</div>
<div id="blog_show_less" style="display: block">
<ul>
<li>&#0164; <a href="#" onClick="$('#blog_show_less').hide(); $('#blog_show_more').show(1000); return false">Show more...</a></li>
</ul>
</div>
{% endif %}

+ 20
- 0
www/blog/tags.partial.gohtml View File

@@ -0,0 +1,20 @@
{{ if .IndexView }}
Sorted by most frequently used:

<ul>
{{ range .Tags }}
<li><a href="/tagged/{{ .Name }}">{{ .Name }}</a> ({{ .Count }})</li>
{{ end }}
</ul>
{{ else }}
<ul>
<li>&#0187; <a href="/archive">Blog Archives</a></li>
{{ range .Tags }}
{{ if ge .Count 8 }}
<li>&#0187; <a href="/tagged/{{ .Name }}">{{ .Name }}</a>
<small>({{ .Count }})</small></li>
{{ end }}
{{ end }}
<li>&#0187; <a href="/tagged">View all tags</a></li>
</ul>
{{ end }}

www/contact/index.html → www/contact/index.gohtml View File

@@ -1,41 +1,10 @@
{% extends "layout.html" %}
{% block title %}Contact Me{% endblock %}
{% block content %}
{{ define "title" }}Contact Me{{ end }}
{{ define "content" }}

<h1>Contact Me</h1>

You can use the form below to send me an e-mail. Alternatively you can contact
me on an instant messenger
(<a href="https://otr.cypherpunks.ca/">Off-the-Record</a> optional):<p>

<blockquote>
<table class="table" style="width: auto" border="0" cellspacing="4" cellpadding="4">
<tr>
<td>
<img src="/static/icons/aim.gif" width="16" height="15" alt="AIM">
</td>
<td>
<strong>AIM:</strong>
</td>
<td>
<a href="aim:goim?ScreenName=Kirsle">Kirsle</a>
</td>
</tr>
<tr>
<td>
<img src="/static/icons/xmpp.gif" width="16" height="16" alt="XMPP">
</td>
<td>
<strong>XMPP:</strong>
</td>
<td>
noah@kirsle.net
</td>
</tr>
</table>
</blockquote>

Things that you <strong>SHOULD NOT</strong> use this form for:
You can use the form below to send me an e-mail. Things that you
<strong>SHOULD NOT</strong> use this form for:

<ul>
<li>Any SEO business solicitations.</li>
@@ -44,8 +13,8 @@ Things that you <strong>SHOULD NOT</strong> use this form for:

For anything else:<p>

<form name="contact" action="{{ url_for('contact.send') }}" method="POST">
<input type="hidden" name="token" value="{{ csrf_token() }}">
<form name="contact" action="/contact" method="POST">
<input type="hidden" name="_csrf" value="{{ .CSRF }}">

<strong>Your name:</strong><br>
<small>(so I know who you are)</small><br>
@@ -72,4 +41,4 @@ For anything else:<p>
</div>
</form>

{% endblock %}
{{ end }}

+ 0
- 442
www/css/bootstrap-theme.css View File

@@ -1,442 +0,0 @@
/*!
* Bootstrap v3.2.0 (http://getbootstrap.com)
* Copyright 2011-2014 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
*/

.btn-default,
.btn-primary,
.btn-success,
.btn-info,
.btn-warning,
.btn-danger {
text-shadow: 0 -1px 0 rgba(0, 0, 0, .2);
-webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075);
box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075);
}
.btn-default:active,
.btn-primary:active,
.btn-success:active,
.btn-info:active,
.btn-warning:active,
.btn-danger:active,
.btn-default.active,
.btn-primary.active,
.btn-success.active,
.btn-info.active,
.btn-warning.active,
.btn-danger.active {
-webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
}
.btn:active,
.btn.active {
background-image: none;
}
.btn-default {
text-shadow: 0 1px 0 #fff;
background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%);
background-image: -o-linear-gradient(top, #fff 0%, #e0e0e0 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#e0e0e0));
background-image: linear-gradient(to bottom, #fff 0%, #e0e0e0 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
background-repeat: repeat-x;
border-color: #dbdbdb;
border-color: #ccc;
}
.btn-default:hover,
.btn-default:focus {
background-color: #e0e0e0;
background-position: 0 -15px;
}
.btn-default:active,
.btn-default.active {
background-color: #e0e0e0;
border-color: #dbdbdb;
}
.btn-default:disabled,
.btn-default[disabled] {
background-color: #e0e0e0;
background-image: none;
}
.btn-primary {
background-image: -webkit-linear-gradient(top, #428bca 0%, #2d6ca2 100%);
background-image: -o-linear-gradient(top, #428bca 0%, #2d6ca2 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#2d6ca2));
background-image: linear-gradient(to bottom, #428bca 0%, #2d6ca2 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff2d6ca2', GradientType=0);
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
background-repeat: repeat-x;
border-color: #2b669a;
}
.btn-primary:hover,
.btn-primary:focus {
background-color: #2d6ca2;
background-position: 0 -15px;
}
.btn-primary:active,
.btn-primary.active {
background-color: #2d6ca2;
border-color: #2b669a;
}
.btn-primary:disabled,
.btn-primary[disabled] {
background-color: #2d6ca2;
background-image: none;
}
.btn-success {
background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%);
background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#419641));
background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
background-repeat: repeat-x;
border-color: #3e8f3e;
}
.btn-success:hover,
.btn-success:focus {
background-color: #419641;
background-position: 0 -15px;
}
.btn-success:active,
.btn-success.active {
background-color: #419641;
border-color: #3e8f3e;
}
.btn-success:disabled,
.btn-success[disabled] {
background-color: #419641;
background-image: none;
}
.btn-info {
background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);
background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#2aabd2));
background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
background-repeat: repeat-x;
border-color: #28a4c9;
}
.btn-info:hover,
.btn-info:focus {
background-color: #2aabd2;
background-position: 0 -15px;
}
.btn-info:active,
.btn-info.active {
background-color: #2aabd2;
border-color: #28a4c9;
}
.btn-info:disabled,
.btn-info[disabled] {
background-color: #2aabd2;
background-image: none;
}
.btn-warning {
background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);
background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#eb9316));
background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
background-repeat: repeat-x;
border-color: #e38d13;
}
.btn-warning:hover,
.btn-warning:focus {
background-color: #eb9316;
background-position: 0 -15px;
}
.btn-warning:active,
.btn-warning.active {
background-color: #eb9316;
border-color: #e38d13;
}
.btn-warning:disabled,
.btn-warning[disabled] {
background-color: #eb9316;
background-image: none;
}
.btn-danger {
background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%);
background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c12e2a));
background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
background-repeat: repeat-x;
border-color: #b92c28;
}
.btn-danger:hover,
.btn-danger:focus {
background-color: #c12e2a;
background-position: 0 -15px;
}
.btn-danger:active,
.btn-danger.active {
background-color: #c12e2a;
border-color: #b92c28;
}
.btn-danger:disabled,
.btn-danger[disabled] {
background-color: #c12e2a;
background-image: none;
}
.thumbnail,
.img-thumbnail {
-webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
}
.dropdown-menu > li > a:hover,
.dropdown-menu > li > a:focus {
background-color: #e8e8e8;
background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8));
background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);
background-repeat: repeat-x;
}
.dropdown-menu > .active > a,
.dropdown-menu > .active > a:hover,
.dropdown-menu > .active > a:focus {
background-color: #357ebd;
background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%);
background-image: -o-linear-gradient(top, #428bca 0%, #357ebd 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#357ebd));
background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0);
background-repeat: repeat-x;
}
.navbar-default {
background-image: -webkit-linear-gradient(top, #fff 0%, #f8f8f8 100%);
background-image: -o-linear-gradient(top, #fff 0%, #f8f8f8 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#f8f8f8));
background-image: linear-gradient(to bottom, #fff 0%, #f8f8f8 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
background-repeat: repeat-x;
border-radius: 4px;
-webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075);
box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075);
}
.navbar-default .navbar-nav > .active > a {
background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f3f3f3 100%);
background-image: -o-linear-gradient(top, #ebebeb 0%, #f3f3f3 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f3f3f3));
background-image: linear-gradient(to bottom, #ebebeb 0%, #f3f3f3 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff3f3f3', GradientType=0);
background-repeat: repeat-x;
-webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075);
box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075);
}
.navbar-brand,
.navbar-nav > li > a {
text-shadow: 0 1px 0 rgba(255, 255, 255, .25);
}
.navbar-inverse {
background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%);
background-image: -o-linear-gradient(top, #3c3c3c 0%, #222 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#3c3c3c), to(#222));
background-image: linear-gradient(to bottom, #3c3c3c 0%, #222 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
background-repeat: repeat-x;
}
.navbar-inverse .navbar-nav > .active > a {
background-image: -webkit-linear-gradient(top, #222 0%, #282828 100%);
background-image: -o-linear-gradient(top, #222 0%, #282828 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#222), to(#282828));
background-image: linear-gradient(to bottom, #222 0%, #282828 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff282828', GradientType=0);
background-repeat: repeat-x;
-webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25);
box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25);
}
.navbar-inverse .navbar-brand,
.navbar-inverse .navbar-nav > li > a {
text-shadow: 0 -1px 0 rgba(0, 0, 0, .25);
}
.navbar-static-top,
.navbar-fixed-top,
.navbar-fixed-bottom {
border-radius: 0;
}
.alert {
text-shadow: 0 1px 0 rgba(255, 255, 255, .2);
-webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05);
box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05);
}
.alert-success {
background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);
background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#c8e5bc));
background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);
background-repeat: repeat-x;
border-color: #b2dba1;
}
.alert-info {
background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%);
background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#b9def0));
background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);
background-repeat: repeat-x;
border-color: #9acfea;
}
.alert-warning {
background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);
background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#f8efc0));
background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);
background-repeat: repeat-x;
border-color: #f5e79e;
}
.alert-danger {
background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);
background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#e7c3c3));
background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);
background-repeat: repeat-x;
border-color: #dca7a7;
}
.progress {
background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);
background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f5f5f5));
background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);
background-repeat: repeat-x;
}
.progress-bar {
background-image: -webkit-linear-gradient(top, #428bca 0%, #3071a9 100%);
background-image: -o-linear-gradient(top, #428bca 0%, #3071a9 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#3071a9));
background-image: linear-gradient(to bottom, #428bca 0%, #3071a9 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3071a9', GradientType=0);
background-repeat: repeat-x;
}
.progress-bar-success {
background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%);
background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#449d44));
background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);
background-repeat: repeat-x;
}
.progress-bar-info {
background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);
background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#31b0d5));
background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);
background-repeat: repeat-x;
}
.progress-bar-warning {
background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);
background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#ec971f));
background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);
background-repeat: repeat-x;
}
.progress-bar-danger {
background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%);
background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c9302c));
background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);
background-repeat: repeat-x;
}
.progress-bar-striped {
background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
}
.list-group {
border-radius: 4px;
-webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
}
.list-group-item.active,
.list-group-item.active:hover,
.list-group-item.active:focus {
text-shadow: 0 -1px 0 #3071a9;
background-image: -webkit-linear-gradient(top, #428bca 0%, #3278b3 100%);
background-image: -o-linear-gradient(top, #428bca 0%, #3278b3 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#3278b3));
background-image: linear-gradient(to bottom, #428bca 0%, #3278b3 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3278b3', GradientType=0);
background-repeat: repeat-x;
border-color: #3278b3;
}
.panel {
-webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .05);
box-shadow: 0 1px 2px rgba(0, 0, 0, .05);
}
.panel-default > .panel-heading {
background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8));
background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);
background-repeat: repeat-x;
}
.panel-primary > .panel-heading {
background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%);
background-image: -o-linear-gradient(top, #428bca 0%, #357ebd 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#357ebd));
background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0);
background-repeat: repeat-x;
}
.panel-success > .panel-heading {
background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);
background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#d0e9c6));
background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);
background-repeat: repeat-x;
}
.panel-info > .panel-heading {
background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);
background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#c4e3f3));
background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);
background-repeat: repeat-x;
}
.panel-warning > .panel-heading {
background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);
background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#faf2cc));
background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);
background-repeat: repeat-x;
}
.panel-danger > .panel-heading {
background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%);
background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#ebcccc));
background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);
background-repeat: repeat-x;
}
.well {
background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);
background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#e8e8e8), to(#f5f5f5));
background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);
background-repeat: repeat-x;
border-color: #dcdcdc;
-webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1);
box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1);
}
/*# sourceMappingURL=bootstrap-theme.css.map */

+ 0
- 1
www/css/bootstrap-theme.css.map
File diff suppressed because it is too large
View File


+ 0
- 5
www/css/bootstrap-theme.min.css
File diff suppressed because it is too large
View File


+ 0
- 6203
www/css/bootstrap.css
File diff suppressed because it is too large
View File


+ 0
- 1
www/css/bootstrap.css.map
File diff suppressed because it is too large
View File


+ 0
- 5
www/css/bootstrap.min.css
File diff suppressed because it is too large
View File


www/designs/index.html → www/designs/index.gohtml View File

@@ -1,6 +1,5 @@
{% extends "layout.html" %}
{% block title %}Web Design{% endblock %}
{% block content %}
{{ define "title" }}Web Design{{ end }}
{{ define "content" }}

<h1>Web Design</h1>

@@ -126,4 +125,4 @@ website, in chronological order.<p>
</div>
</div>

{% endblock %}
{{ end }}

+ 49
- 0
www/download.gohtml View File

@@ -0,0 +1,49 @@
{{ define "title" }}Download{{ end }}
{{ define "content" }}

{{ $method := or (.Request.FormValue "method") "index" }}
{{ $project := .Request.FormValue "project" }}
{{ $file := .Request.FormValue "file" }}
{{ if eq $project "" }}
<h1>An error has occurred</h1>
{{ else if eq $method "index" }}
<h1>Project {{ $project }}</h1>

You are about to download the file <strong>{{ $file }}</strong> from the
project <strong>{{ $project }}</strong>. <!-- This file has been downloaded
0 time(s). -->

<h1>Download</h1>

To continue your download, click on the button below.
<br><br><br>

<form name="download" action="/download" method="POST">
<input type="hidden" name="_csrf" value="{{ .CSRF }}">
<input type="hidden" name="method" value="get">
<input type="hidden" name="project" value="{{ $project }}">
<input type="hidden" name="file" value="{{ $file }}">

<span style="background-color: #88AADD; padding: 15px; border-top: 2px solid #006699;
border-left: 2px solid #006699; border-right: 2px solid #AACCFF; border-bottom: 2px solid #AACCFF">
<button type="submit">Download Now</button>
</span>
</form>
{{ else if eq $method "get" }}
<h1>Downloading File...</h1>

Your download of <strong>{{ $file }}</strong> will begin shortly. If it doesn't,
<a href="/projects/{{ $project }}/{{ $file }}">download it directly</a>.

<script type="text/javascript">
(function() {
setTimeout(function() {
window.location.href = "/projects/{{ $project }}/{{ $file }}";
}, 2000);
})();
</script>
{{ else }}
<h1>An error has occurred.</h1>
{{ end}}

{{ end }}

+ 0
- 44
www/download.html View File

@@ -1,44 +0,0 @@
{% extends "layout.html" %}
{% block title %}Download Manager{% endblock %}
{% block content %}

{% if method == "index" %}
<h1>Project {{ project }}</h1>

You are about to download the file <strong>{{ file }}</strong> from the
project <strong>{{ project }}</strong>. This file has been downloaded
{{ hits }} time(s).

<h1>Download</h1>

To continue your download, click on the button below.
<br><br><br>

<form name="download" action="/download" method="POST">
<input type="hidden" name="token" value="{{ csrf_token() }}">
<input type="hidden" name="method" value="get">
<input type="hidden" name="project" value="{{ project }}">
<input type="hidden" name="file" value="{{ file }}">

<span style="background-color: #88AADD; padding: 15px; border-top: 2px solid #006699;
border-left: 2px solid #006699; border-right: 2px solid #AACCFF; border-bottom: 2px solid #AACCFF">
<button type="submit">Download Now</button>
</span>
</form>
{% elif method == "get" %}
<h1>Downloading File...</h1>

Your download of <strong>{{ file }}</strong> will begin shortly. If it doesn't,
<a href="/projects/{{ project }}/{{ file }}">download it directly</a>.
{% endif %}

{% endblock %}
{% block scripts %}
{% if method == "get" %}
<script>
$(document).ready(function() {
window.location.href = "/projects/{{ project }}/{{ file }}";
});
</script>
{% endif %}
{% endblock %}

www/errorgen.html → www/errorgen.gohtml View File

@@ -1,6 +1,5 @@
{% extends "layout.html" %}
{% block title %}Error Message Generator{% endblock %}
{% block content %}
{{ define "title" }}Error Message Generator{{ end }}
{{ define "content" }}

<h1>Error Message Generator</h1>

@@ -189,4 +188,4 @@
</tr>
</table>

{% endblock %}
{{ end }}

www/firered.html → www/firered.gohtml View File

@@ -1,6 +1,5 @@
{% extends "layout.html" %}
{% block title %}Sequence Breaking Pokemon FireRed{% endblock %}
{% block content %}
{{ define "title" }}Sequence Breaking Pokemon FireRed{{ end }}
{{ define "content" }}

<h1>Sequence Breaking Pokemon FireRed</h1>

@@ -8,28 +7,6 @@ This is the story of my quest to <a href="http://tvtropes.org/pmwiki/pmwiki.php/
Break</a> Pokemon FireRed Version. I decided a good place to begin my quest would be Fuchsia City instead of
Palette Town. This is what happened...

{% set pages = {
"1": "Getting to Fuchsia City",
"2": "Level Grinding on Silence Bridge",
"3": "On the Road to Cerulean City",
"4": "Breaking Mt. Moon"
} %}
<ul>
{% for i in pages|sort %}
{% set link = pages[i] %}

<li>
{% if i == page %}
<strong>Part {{ i }} - {{ link }}</strong>
{% else %}
<a href="/firered{% if i != '1' %}/{{ i }}{% endif %}">Part {{ i }} - {{ link }}</a>
{% endif %}
</li>
{% endfor %}
<li><a href="/firered/full">All on one page</a></li>
</ul>

{% if page == "1" or page == "full" %}
<h2>The Original Idea</h2>

In the zoo in Fuchsia City in front of the
@@ -179,12 +156,10 @@ Palette Town. This is what happened...
<em>Charmander is evolving!</em>
</div>

{% if page == "1" %}
<p>&gt; Continue to <a href="/firered/2">Part 2 - {{ pages["2"] }}</a>
{% endif %}
{% endif %}

{% if page == "2" or page == "full" %}



<h1>Level Grinding on Silence Bridge</h1>

After battling my way through the Bikers and Bird Catchers, I finally
@@ -321,12 +296,11 @@ Palette Town. This is what happened...
<em>North to Cerulean City, south to Vermilion City.</em>
</div>

{% if page == "2" %}
<p>&gt; Continue to <a href="/firered/3">Part 3 - {{ pages["3"] }}</a>
{% endif %}
{% endif %}

{% if page == "3" or page == "full" %}




<h1>On the Road to Cerulean City</h1>

<div class="center">
@@ -453,12 +427,11 @@ Palette Town. This is what happened...
<em>My gym badges so far. I never got the 1<sup>st</sup> badge.</em>
</div>

{% if page == "3" %}
<p>&gt; Continue to <a href="/firered/4">Part 4 - {{ pages["4"] }}</a>
{% endif %}
{% endif %}

{% if page == "4" or page == "full" %}




<h1>Breaking Mt. Moon</h1>

<div class="center">
@@ -594,12 +567,8 @@ Palette Town. This is what happened...

So this is where my quest comes to an end. If anybody has any new
ideas, feel free to leave me a comment about them. :)
{% endif %}

<p>
{{ include_page("comment.partial_index",
thread="article-firered",
subject="Sequence Breaking FireRed Version",
) | safe }}
{{ RenderComments "Sequence Breaking Pokémon FireRed" "article-firered" }}

{% endblock %}
{{ end }}

+ 21
- 0
www/flash/aichaos-warners.gohtml View File

@@ -0,0 +1,21 @@
{{ define "title" }}AiChaos Warners - Flash Animations{{ end }}
{{ define "content" }}

<h1>AiChaos Warners</h1>

<script src="//ajax.googleapis.com/ajax/libs/swfobject/2.2/swfobject.js"></script>

<div id="swfObject"></div>
<br><br>

<script>
swfobject.embedSWF("/creativity/flash/warners.swf", "swfObject",
550, 400,
"10.0.0"
);
</script>


&#0171; <a href="/flash">More Flash Animations</a>

{{ end }}

+ 0
- 15
www/flash/aichaos-warners.html View File

@@ -1,15 +0,0 @@
{% extends "layout.html" %}
{% block title %}AiChaos Warners - Flash Animations{% endblock %}
{% block content %}

<h1>AiChaos Warners</h1>

{% set swf_path="/creativity/flash/warners.swf" %}
{% set swf_width=550 %}
{% set swf_height=400 %}
{% include "flash/flash-common.html" %}


&#0171; <a href="/flash">More Flash Animations</a>

{% endblock %}

+ 0
- 12
www/flash/flash-common.html View File

@@ -1,12 +0,0 @@
<script src="//ajax.googleapis.com/ajax/libs/swfobject/2.2/swfobject.js"></script>

<div id="swfObject"></div>
<br><br>

<script>
swfobject.embedSWF("{{ swf_path }}", "swfObject",
{{ swf_width }}, {{ swf_height }},
"10.0.0"
);
</script>


www/flash/index.html → www/flash/index.gohtml View File

@@ -1,6 +1,5 @@
{% extends "layout.html" %}
{% block title %}Flash Animations{% endblock %}
{% block content %}
{{ define "title" }}Flash Animations{{ end }}
{{ define "content" }}

<h1>Flash Animations</h1>

@@ -34,4 +33,4 @@ their main problem was AIM's warning system. Almost anybody could warn the bot p
attack). This is a short Flash animation I put up to give the warners a piece of
my mind.

{% endblock %}
{{ end }}

+ 20
- 0
www/flash/kanian-azulian-war.gohtml View File

@@ -0,0 +1,20 @@
{{ define "title" }}Kanian/Azulian War - Flash Animations{{ end }}
{{ define "content" }}

<h1>Kanian/Azulian War</h1>

<script src="//ajax.googleapis.com/ajax/libs/swfobject/2.2/swfobject.js"></script>

<div id="swfObject"></div>
<br><br>

<script>
swfobject.embedSWF("/creativity/flash/KanianAzuWar.swf", "swfObject",
550, 400,
"10.0.0"
);
</script>

&#0171; <a href="/flash">More Flash Animations</a>

{{ end }}

+ 0
- 14
www/flash/kanian-azulian-war.html View File

@@ -1,14 +0,0 @@
{% extends "layout.html" %}
{% block title %}Kanian/Azulian War - Flash Animations{% endblock %}
{% block content %}

<h1>Kanian/Azulian War</h1>

{% set swf_path="/creativity/flash/KanianAzuWar.swf" %}
{% set swf_width=550 %}
{% set swf_height=400 %}
{% include "flash/flash-common.html" %}

&#0171; <a href="/flash">More Flash Animations</a>

{% endblock %}

+ 20
- 0
www/flash/pwnizard-i-choose-you.gohtml View File

@@ -0,0 +1,20 @@
{{ define "title" }}Pwnizard, I Choose You! - Flash Animations{{ end }}
{{ define "content" }}

<h1>Pwnizard, I Choose You!</h1>

<script src="//ajax.googleapis.com/ajax/libs/swfobject/2.2/swfobject.js"></script>

<div id="swfObject"></div>
<br><br>

<script>
swfobject.embedSWF("/creativity/flash/pwnizard.swf", "swfObject",
550, 400,
"10.0.0"
);
</script>

&#0171; <a href="/flash">More Flash Animations</a>

{{ end }}

+ 0
- 14
www/flash/pwnizard-i-choose-you.html View File

@@ -1,14 +0,0 @@
{% extends "layout.html" %}
{% block title %}Pwnizard, I Choose You! - Flash Animations{% endblock %}
{% block content %}

<h1>Pwnizard, I Choose You!</h1>

{% set swf_path="/creativity/flash/pwnizard.swf" %}
{% set swf_width=480 %}
{% set swf_height=320 %}
{% include "flash/flash-common.html" %}

&#0171; <a href="/flash">More Flash Animations</a>

{% endblock %}

www/fonts.html → www/fonts.gohtml View File

@@ -1,6 +1,5 @@
{% extends "layout.html" %}
{% block title %}TrueType Fonts{% endblock %}
{% block content %}
{{ define "title" }}TrueType Fonts{{ end }}
{{ define "content" }}

<h1>TrueType Fonts</h1>

@@ -48,4 +47,4 @@ letters than are in the English alphabet and I did that on purpose.<p>

&#0164; <a href="/download?project=TTF&file=Lorelei.zip">Download Lorelei.ttf</a> (ZIP; 7.66 KB)

{% endblock %}
{{ end }}

+ 0
- 33
www/google-ads.inc.html View File

@@ -1,33 +0,0 @@
{# Google ads for Kirsle.net #}

{% macro nav_ads() %}
<div style="text-align: center">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-0838718168234603";
/* Kirsle.net Nav */
google_ad_slot = "1728209841";
google_ad_width = 120;
google_ad_height = 240;
//-->
</script>
<script type="text/javascript"
src="//pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
</div>
{% endmacro %}

{% macro leaderboard() %}
<div style="text-align: center" class="google-leaderboard">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-0838718168234603";
/* Kirsle.net Leaderboard */
google_ad_slot = "9251476641";
google_ad_width = 728;
google_ad_height = 90;
//-->
</script>
<script type="text/javascript"
src="//pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
</div>
{% endmacro %}

+ 8
- 0
www/guestbook.gohtml View File

@@ -0,0 +1,8 @@
{{ define "title" }}My Guestbook{{ end }}
{{ define "content" }}

<h1>My Guestbook</h1>

{{ RenderComments "Guestbook" "guestbook" }}

{{ end }}

+ 0
- 13
www/guestbook.html View File

@@ -1,13 +0,0 @@
{% extends "layout.html" %}
{% block title %}My Guestbook{% endblock %}
{% block content %}

<h1>My Guestbook</h1>

{{ include_page("comment.partial_index",
thread="guestbook",
subject="My Guestbook",
header=False,
) | safe }}

{% endblock %}

www/index.html → www/index.gohtml View File

@@ -1,13 +1,11 @@
{% extends "layout.html" %}
{% block title %}Welcome!{% endblock %}
{% block content %}

{{ define "title" }}Welcome!{{ end }}
{{ define "content" }}
<h1>Welcome!</h1>

Welcome to <a href="http://www.kirsle.net/">Kirsle.net</a>! This is the personal
website of Noah Petherbridge, and it's where my various software projects and
web blog lives.<p>

{{ include_page("blog.partial_index") | safe }}
{{ RenderIndex .Request "" "" }}

{% endblock %}
{{ end }}

www/javascript.html → www/javascript.gohtml View File

@@ -1,6 +1,5 @@
{% extends "layout.html" %}
{% block title %}Creative JavaScripts{% endblock %}
{% block content %}
{{ define "title" }}Creative JavaScripts{{ end }}
{{ define "content" }}

<h1>Creative JavaScripts</h1>

@@ -31,7 +30,7 @@ programming and attention to detail.<p>
&#0164; <a href="creativity/javascript/jsrpg.html" onClick="return openWin(this)">
View this script in action</a><p>

{% endblock %}
{{ end }}
{% block scripts %}
<script type="text/javascript">
function openWin(obj) {
@@ -39,4 +38,4 @@ function openWin(obj) {
return false;
}
</script>
{% endblock %}
{% endblock %}

www/msdos.html → www/msdos.gohtml View File

@@ -1,6 +1,5 @@
{% extends "layout.html" %}
{% block title %}MS-DOS{% endblock %}
{% block content %}
{{ define "title" }}MS-DOS{{ end }}
{{ define "content" }}

<h1>MS-DOS &amp; Software</h1>

@@ -54,10 +53,6 @@ with VirtualBox's emulated hardware. Drivers include:

For tips, tricks, or to leave comments, see the relevant blog post "<a href="/blog/kirsle/ms-dos-and-windows-3-1">MS-DOS and Windows 3.1</a>". The comments on that blog post are shared to this page as well (so comments on either page show up in both places).<p>

{{ include_page("comment.partial_index",
thread="blog-42",
subject="MS-DOS",
header=False,
) | safe }}
{{ RenderComments "MS-DOS" "post-42" }}

{% endblock %}
{{ end }}

www/pccc.html → www/pccc.gohtml View File

@@ -1,6 +1,5 @@
{% extends "layout.html" %}
{% block title %}Perl CyanChat Client{% endblock %}
{% block content %}
{{ define "title" }}Perl CyanChat Client{{ end }}
{{ define "content" }}

<h1>Perl CyanChat Client</h1>

@@ -351,4 +350,4 @@
</tr>
</table>

{% endblock %}
{{ end }}

www/raspberrypi.html → www/raspberrypi.gohtml View File

@@ -1,6 +1,5 @@
{% extends "layout.html" %}
{% block title %}Raspberry Pi{% endblock %}
{% block content %}
{{ define "title" }}Raspberry Pi{{ end }}
{{ define "content" }}

<h1>Raspberry Pi</h1>

@@ -78,9 +77,6 @@ the <code>audio</code> group.
You'll need to do this <em>before</em> starting the VNC server. If you've already
started one, shut it down and restart it.

{{ include_page("comment.partial_index",
thread="article-raspberrypi",
subject="Raspberry Pi",
) | safe }}
{{ RenderComments "Raspberry Pi" "raspberrypi" }}

{% endblock %}
{{ end }}

www/rendering.html → www/rendering.gohtml View File

@@ -1,13 +1,12 @@
{% extends "layout.html" %}
{% block title %}3D Renderings{% endblock %}
{% block content %}
{{ define "title" }}3D Renderings{{ end }}
{{ define "content" }}

<h1>3D Renderings</h1>

This page contains some of my better 3D renderings. Most of these images were
modeled more or less in AutoCAD 2006 and rendered in 3DS Max 8.<p>

<table border="0" cellspacing="10" cellpadding="0">
<table border="0" cellspacing="10" cellpadding="10">
<tr>
<td align="center" valign="top">
<a href="/creativity/rendered/kawar.jpg">
@@ -125,4 +124,4 @@ modeled more or less in AutoCAD 2006 and rendered in 3DS Max 8.<p>
</tr>
</table>

{% endblock %}
{{ end }}

www/rivescript.html → www/rivescript.gohtml View File

@@ -1,6 +1,5 @@
{% extends "layout.html" %}
{% block title %}RiveScript{% endblock %}
{% block content %}
{{ define "title" }}RiveScript{{ end }}
{{ define "content" }}

<h1>RiveScript</h1>

@@ -177,4 +176,4 @@ What is its name?
could utilize, or provide the source code to allow it to be directly compiled in with other
programs.

{% endblock %}
{{ end }}

+ 46
- 46
www/solar/monokai.css View File

@@ -2,51 +2,51 @@
* http://tmtheme-editor.herokuapp.com/#/theme/Monokai%20Bright
* Using: https://github.com/davinche/pygments-from-tmtheme
*/
.codehilite { color: #F8F8F2; }
.codehilite .ge { font-style: italic; }
.codehilite .gs { font-weight: bold; }
.codehilite .c { color: #75715E; }
.codehilite .cp { color: #75715E; }
.codehilite .c1 { color: #75715E; }
.codehilite .cs { color: #75715E; }
.codehilite .cm { color: #75715E; }
.codehilite .m { color: #AE81FF; }
.codehilite .mf { color: #AE81FF; }
.codehilite .mi { color: #AE81FF; }
.codehilite .mo { color: #AE81FF; }
.codehilite .se { color: #AE81FF; }
.codehilite .kc { color: #AE81FF; }
.codehilite .k { color: #66D9EF; font-style: italic; }
.codehilite .kd { color: #66D9EF; font-style: italic; }
.codehilite .kn { color: #F92672; }
.codehilite .kt { color: #66D9EF; font-style: italic; }
.codehilite .s { color: #E6DB74; }
.codehilite .sb { color: #E6DB74; }
.codehilite .sc { color: #E6DB74; }
.codehilite .sd { color: #E6DB74; }
.codehilite .s2 { color: #E6DB74; }
.codehilite .sh { color: #E6DB74; }
.codehilite .si { color: #E6DB74; }
.codehilite .sx { color: #E6DB74; }
.codehilite .sr { color: #E6DB74; }
.codehilite .s1 { color: #E6DB74; }
.codehilite .ss { color: #E6DB74; }
.codehilite .na { color: #A6E22E; }
.codehilite .nc { color: #A6E22E; font-style: italic; text-decoration: underline; }
.codehilite .no { color: #AE81FF; }
.codehilite .nd { color: #A6E22E; text-decoration: underline; }
.codehilite .ne { color: #A6E22E; text-decoration: underline; }
.codehilite .nf { color: #A6E22E; }
.codehilite .nt { color: #F92672; }
.codehilite .nv { color: #F8F8F2; }
.codehilite .ow { color: #F92672; }
.codehilite .o { color: #F92672; }
.codehilite .n { color: #F8F8F2; }
.codehilite .nl { color: #F8F8F2; }
.codehilite .nn { color: #F8F8F2; }
.codehilite .nx { color: #F8F8F2; }
.codehilite .bp { color: #F8F8F2; }
.codehilite .p { color: #F8F8F2; }
.highlight { color: #F8F8F2; }
.highlight .ge { font-style: italic; }
.highlight .gs { font-weight: bold; }
.highlight .c { color: #75715E; }
.highlight .cp { color: #75715E; }
.highlight .c1 { color: #75715E; }
.highlight .cs { color: #75715E; }
.highlight .cm { color: #75715E; }
.highlight .m { color: #AE81FF; }
.highlight .mf { color: #AE81FF; }
.highlight .mi { color: #AE81FF; }
.highlight .mo { color: #AE81FF; }
.highlight .se { color: #AE81FF; }
.highlight .kc { color: #AE81FF; }
.highlight .k { color: #66D9EF; font-style: italic; }
.highlight .kd { color: #66D9EF; font-style: italic; }
.highlight .kn { color: #F92672; }
.highlight .kt { color: #66D9EF; font-style: italic; }
.highlight .s { color: #E6DB74; }
.highlight .sb { color: #E6DB74; }
.highlight .sc { color: #E6DB74; }
.highlight .sd { color: #E6DB74; }
.highlight .s2 { color: #E6DB74; }
.highlight .sh { color: #E6DB74; }
.highlight .si { color: #E6DB74; }
.highlight .sx { color: #E6DB74; }
.highlight .sr { color: #E6DB74; }
.highlight .s1 { color: #E6DB74; }
.highlight .ss { color: #E6DB74; }
.highlight .na { color: #A6E22E; }
.highlight .nc { color: #A6E22E; font-style: italic; text-decoration: underline; }
.highlight .no { color: #AE81FF; }
.highlight .nd { color: #A6E22E; text-decoration: underline; }
.highlight .ne { color: #A6E22E; text-decoration: underline; }
.highlight .nf { color: #A6E22E; }
.highlight .nt { color: #F92672; }
.highlight .nv { color: #F8F8F2; }
.highlight .ow { color: #F92672; }
.highlight .o { color: #F92672; }
.highlight .n { color: #F8F8F2; }
.highlight .nl { color: #F8F8F2; }
.highlight .nn { color: #F8F8F2; }
.highlight .nx { color: #F8F8F2; }
.highlight .bp { color: #F8F8F2; }
.highlight .p { color: #F8F8F2; }

/* Kirsle.net overrides */
.codehilite { background-color: transparent }
.highlight { background-color: transparent }

+ 47
- 191
www/solar/ui.css View File

@@ -91,12 +91,16 @@ input[type="email"],
textarea,
input[type="file"],
select { /* To hell with IE */
background-color: #000000 !important;
background-color: #000 !important;
border: 1px solid #999 !important;
font-family: Verdana,Arial,Helvetica,sans-serif !important;
font-size: small !important;
color: #CCCCCC !important;
color: #FFF !important;
margin: 2px 0px;
max-width: 400px;
max-width: 600px;
}
input:focus, textarea:focus, select:focus {
border: 1px solid #09F !important;
}
acronym,abbr {
border-bottom: 1px dotted #BEBEBE;
@@ -116,6 +120,10 @@ acronym,abbr {
}

/* Bootstrap CSS overrides */
a.btn {
text-decoration: none;
color: white;
}
p {
margin: 10px 0px;
}
@@ -129,6 +137,10 @@ li > ul, li > ol {
blockquote {
margin: 20px 0px;
}
.card {
background-color: transparent;
border: 1px dashed #006699;
}

/* Our own custom nav button for Bootstrap */
.mobile-nav {
@@ -136,10 +148,10 @@ blockquote {
position: absolute;
z-index: 100;
top: 10px;
right: 10px;
left: 10px;
}

@media (max-width: 768px) {
@media (max-width: 990px) {
.mobile-nav {
display: block;
}
@@ -233,120 +245,17 @@ table.table td {
float: left
}

/**********
* Photos *
**********/

/* Photo Upload page */
.photo-upload-dropbox {
border: 2px dashed #0099FF;
padding: 40px;
}
.photo-upload-dropbox.active {
border: 4px dashed #FF99FF;
}
.upload-trough {
position: relative;
border: 1px solid #000000;
width: 100%;
height: 28px;
}
.upload-progress-bar {
position: relative;
width: 0%;
height: 100%;
background-color: #FF9900;
}

/* Photo Grids: see http://ansciath.tumblr.com/post/7347495869/css-aspect-ratio */
ul.photo-grid {
list-style: none;
display: inline;
margin: 0;
padding: 0;
position: relative;
}

ul.photo-grid li {
position: relative;
/*float: left;*/
display: inline-block;
width: 260px;
height: 260px;
margin-left: 20px;
margin-top: 20px;
}

ul.photo-grid li .dummy {
padding-top: 100%;
}

.photo-grid-item {
cursor: pointer;
overflow: hidden; /* Crop off long names, etc. */

/* We use absolute positioning to detach this element from the flow, */
/* allowing the .dummy to dictate the height of the square. */
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
}

.photo-grid-item img {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
}

.photo-grid-item .name {