Skip to content
Snippets Groups Projects
Commit 3a32aad1 authored by Anton Sarukhanov's avatar Anton Sarukhanov
Browse files

Merge branch 'pelican' into 'master'

Switch from Hyde to Pelican

[Hyde docs](http://hyde.github.io/) are spotty/inconsistent, and the user base seems skimpy. Discovered [Pelican](http://docs.getpelican.com/en/3.6.3/), which seems somewhat nicer. Since I haven't invested *too* much time into the Hyde version, decided to switch and try Pelican instead.

Added bower, normalize.css, minimal templates, and a homepage placeholder.

See merge request !1
parents b64fa2e6 abec5c3f
No related branches found
No related tags found
1 merge request!1Switch from Hyde to Pelican
# Hyde Build Artifacts
deploy/
.hyde_deps
# Pelican
output
# Compiled py
*.pyc
# Bower
bower_components
content/lib
# Vim swap
*.swp
# Python
*.py[cod]
venv/
Makefile 0 → 100644
PY?=python3
PELICAN?=pelican
PELICANOPTS=
BASEDIR=$(CURDIR)
INPUTDIR=$(BASEDIR)/content
OUTPUTDIR=$(BASEDIR)/output
CONFFILE=$(BASEDIR)/pelicanconf.py
PUBLISHCONF=$(BASEDIR)/publishconf.py
FTP_HOST=localhost
FTP_USER=anonymous
FTP_TARGET_DIR=/
SSH_HOST=localhost
SSH_PORT=22
SSH_USER=root
SSH_TARGET_DIR=/var/www
S3_BUCKET=my_s3_bucket
CLOUDFILES_USERNAME=my_rackspace_username
CLOUDFILES_API_KEY=my_rackspace_api_key
CLOUDFILES_CONTAINER=my_cloudfiles_container
DROPBOX_DIR=~/Dropbox/Public/
GITHUB_PAGES_BRANCH=gh-pages
DEBUG ?= 0
ifeq ($(DEBUG), 1)
PELICANOPTS += -D
endif
RELATIVE ?= 0
ifeq ($(RELATIVE), 1)
PELICANOPTS += --relative-urls
endif
help:
@echo 'Makefile for a pelican Web site '
@echo ' '
@echo 'Usage: '
@echo ' make html (re)generate the web site '
@echo ' make clean remove the generated files '
@echo ' make regenerate regenerate files upon modification '
@echo ' make publish generate using production settings '
@echo ' make serve [PORT=8000] serve site at http://localhost:8000'
@echo ' make serve-global [SERVER=0.0.0.0] serve (as root) to $(SERVER):80 '
@echo ' make devserver [PORT=8000] start/restart develop_server.sh '
@echo ' make stopserver stop local server '
@echo ' make ssh_upload upload the web site via SSH '
@echo ' make rsync_upload upload the web site via rsync+ssh '
@echo ' make dropbox_upload upload the web site via Dropbox '
@echo ' make ftp_upload upload the web site via FTP '
@echo ' make s3_upload upload the web site via S3 '
@echo ' make cf_upload upload the web site via Cloud Files'
@echo ' make github upload the web site via gh-pages '
@echo ' '
@echo 'Set the DEBUG variable to 1 to enable debugging, e.g. make DEBUG=1 html '
@echo 'Set the RELATIVE variable to 1 to enable relative urls '
@echo ' '
html:
$(PELICAN) $(INPUTDIR) -o $(OUTPUTDIR) -s $(CONFFILE) $(PELICANOPTS)
clean:
[ ! -d $(OUTPUTDIR) ] || rm -rf $(OUTPUTDIR)
regenerate:
$(PELICAN) -r $(INPUTDIR) -o $(OUTPUTDIR) -s $(CONFFILE) $(PELICANOPTS)
serve:
ifdef PORT
cd $(OUTPUTDIR) && $(PY) -m pelican.server $(PORT)
else
cd $(OUTPUTDIR) && $(PY) -m pelican.server
endif
serve-global:
ifdef SERVER
cd $(OUTPUTDIR) && $(PY) -m pelican.server 80 $(SERVER)
else
cd $(OUTPUTDIR) && $(PY) -m pelican.server 80 0.0.0.0
endif
devserver:
ifdef PORT
$(BASEDIR)/develop_server.sh restart $(PORT)
else
$(BASEDIR)/develop_server.sh restart
endif
stopserver:
$(BASEDIR)/develop_server.sh stop
@echo 'Stopped Pelican and SimpleHTTPServer processes running in background.'
publish:
$(PELICAN) $(INPUTDIR) -o $(OUTPUTDIR) -s $(PUBLISHCONF) $(PELICANOPTS)
ssh_upload: publish
scp -P $(SSH_PORT) -r $(OUTPUTDIR)/* $(SSH_USER)@$(SSH_HOST):$(SSH_TARGET_DIR)
rsync_upload: publish
rsync -e "ssh -p $(SSH_PORT)" -P -rvzc --delete $(OUTPUTDIR)/ $(SSH_USER)@$(SSH_HOST):$(SSH_TARGET_DIR) --cvs-exclude
dropbox_upload: publish
cp -r $(OUTPUTDIR)/* $(DROPBOX_DIR)
ftp_upload: publish
lftp ftp://$(FTP_USER)@$(FTP_HOST) -e "mirror -R $(OUTPUTDIR) $(FTP_TARGET_DIR) ; quit"
s3_upload: publish
s3cmd sync $(OUTPUTDIR)/ s3://$(S3_BUCKET) --acl-public --delete-removed --guess-mime-type
cf_upload: publish
cd $(OUTPUTDIR) && swift -v -A https://auth.api.rackspacecloud.com/v1.0 -U $(CLOUDFILES_USERNAME) -K $(CLOUDFILES_API_KEY) upload -c $(CLOUDFILES_CONTAINER) .
github: publish
ghp-import -m "Generate Pelican site" -b $(GITHUB_PAGES_BRANCH) $(OUTPUTDIR)
git push origin $(GITHUB_PAGES_BRANCH)
.PHONY: html help clean regenerate serve serve-global devserver publish ssh_upload rsync_upload dropbox_upload ftp_upload s3_upload cf_upload github
# ant.sr
My personal website. Build with [Hyde](http://hyde.github.io/), a static site generator written in Python.
My personal website. Built with
[Pelican](http://docs.getpelican.com/en/3.6.3/index.html),
a static site generator written in Python.
## Setup
`pip install -r requirements.txt`
## Development Server
* `hyde gen` to build the site
* `hyde serve -a0` to listen on 0.0.0.0:8080
\ No newline at end of file
* `pip install -r requirements.txt` to install Python dependencies
* `bower-installer` to install front-end dependencies
{
"name": "ant.sr",
"authors": [
"Anton Sarukhanov <code@ant.sr>"
],
"description": "Anton Sarukhanov's personal website",
"private": true,
"ignore": [
"**/.*",
"node_modules",
"bower_components",
"test",
"tests"
],
"dependencies": {
"normalize-css": "normalize.css#^4.1.1"
},
"install": {
"path": "content/lib"
}
}
---
title: Not Found
extends: base.j2
---
## Not Found
Sorry, there's nothing here.
Perhaps you'd like to check out my [blog posts](blog), or [get in touch](contact)?
---
title: Blog
extends: base.j2
---
## This is my blog
coming soon
---
title: Contact
extends: base.j2
---
## Yo Dawg
Lets talk.
```
echo $THOUGHTS >/dev/null
```
But actually, [mail@ant.sr](mailto:mail@ant.sr).
---
extends: base.j2
---
## Hi! My name is Anton.
I have a passion for solving problems with technology.
I’m an experienced front- and back-end developer, currently
maintaining custom PHP and Python solutions for [Rutgers OIT][oit].
When I’m not working I enjoy tinkering with electronics,
[building stuff](blog), nature, and bike rides.
Do you have a tough technical challenge? Need a website,
custom software, or a hardware integration? [I’d love to hear from you.](contact)
## Recent Posts
coming soon
## Recent Code Commits
coming soon
## Projects
coming soon
[oit]: https://oit.rutgers.edu "Rutgers OIT"
level: basic
Title: Anton Sarukhanov
Menu_Title: Home
URL:
Template: home
Save_As: index.html
Hello world.
#!/usr/bin/env bash
##
# This section should match your Makefile
##
PY=${PY:-python3}
PELICAN=${PELICAN:-pelican}
PELICANOPTS=
BASEDIR=$(pwd)
INPUTDIR=$BASEDIR/content
OUTPUTDIR=$BASEDIR/output
CONFFILE=$BASEDIR/pelicanconf.py
###
# Don't change stuff below here unless you are sure
###
SRV_PID=$BASEDIR/srv.pid
PELICAN_PID=$BASEDIR/pelican.pid
function usage(){
echo "usage: $0 (stop) (start) (restart) [port]"
echo "This starts Pelican in debug and reload mode and then launches"
echo "an HTTP server to help site development. It doesn't read"
echo "your Pelican settings, so if you edit any paths in your Makefile"
echo "you will need to edit your settings as well."
exit 3
}
function alive() {
kill -0 $1 >/dev/null 2>&1
}
function shut_down(){
PID=$(cat $SRV_PID)
if [[ $? -eq 0 ]]; then
if alive $PID; then
echo "Stopping HTTP server"
kill $PID
else
echo "Stale PID, deleting"
fi
rm $SRV_PID
else
echo "HTTP server PIDFile not found"
fi
PID=$(cat $PELICAN_PID)
if [[ $? -eq 0 ]]; then
if alive $PID; then
echo "Killing Pelican"
kill $PID
else
echo "Stale PID, deleting"
fi
rm $PELICAN_PID
else
echo "Pelican PIDFile not found"
fi
}
function start_up(){
local port=$1
echo "Starting up Pelican and HTTP server"
shift
$PELICAN --debug --autoreload -r $INPUTDIR -o $OUTPUTDIR -s $CONFFILE $PELICANOPTS &
pelican_pid=$!
echo $pelican_pid > $PELICAN_PID
cd $OUTPUTDIR
$PY -m pelican.server $port &
srv_pid=$!
echo $srv_pid > $SRV_PID
cd $BASEDIR
sleep 1
if ! alive $pelican_pid ; then
echo "Pelican didn't start. Is the Pelican package installed?"
return 1
elif ! alive $srv_pid ; then
echo "The HTTP server didn't start. Is there another service using port" $port "?"
return 1
fi
echo 'Pelican and HTTP server processes now running in background.'
}
###
# MAIN
###
[[ ($# -eq 0) || ($# -gt 2) ]] && usage
port=''
[[ $# -eq 2 ]] && port=$2
if [[ $1 == "stop" ]]; then
shut_down
elif [[ $1 == "restart" ]]; then
shut_down
start_up $port
elif [[ $1 == "start" ]]; then
if ! start_up $port; then
shut_down
fi
else
usage
fi
from fabric.api import *
import fabric.contrib.project as project
import os
import shutil
import sys
import SocketServer
from pelican.server import ComplexHTTPRequestHandler
# Local path configuration (can be absolute or relative to fabfile)
env.deploy_path = 'output'
DEPLOY_PATH = env.deploy_path
# Remote server configuration
production = 'root@localhost:22'
dest_path = '/var/www'
# Rackspace Cloud Files configuration settings
env.cloudfiles_username = 'my_rackspace_username'
env.cloudfiles_api_key = 'my_rackspace_api_key'
env.cloudfiles_container = 'my_cloudfiles_container'
# Github Pages configuration
env.github_pages_branch = "gh-pages"
# Port for `serve`
PORT = 8000
def clean():
"""Remove generated files"""
if os.path.isdir(DEPLOY_PATH):
shutil.rmtree(DEPLOY_PATH)
os.makedirs(DEPLOY_PATH)
def build():
"""Build local version of site"""
local('pelican -s pelicanconf.py')
def rebuild():
"""`clean` then `build`"""
clean()
build()
def regenerate():
"""Automatically regenerate site upon file modification"""
local('pelican -r -s pelicanconf.py')
def serve():
"""Serve site at http://localhost:8000/"""
os.chdir(env.deploy_path)
class AddressReuseTCPServer(SocketServer.TCPServer):
allow_reuse_address = True
server = AddressReuseTCPServer(('', PORT), ComplexHTTPRequestHandler)
sys.stderr.write('Serving on port {0} ...\n'.format(PORT))
server.serve_forever()
def reserve():
"""`build`, then `serve`"""
build()
serve()
def preview():
"""Build production version of site"""
local('pelican -s publishconf.py')
def cf_upload():
"""Publish to Rackspace Cloud Files"""
rebuild()
with lcd(DEPLOY_PATH):
local('swift -v -A https://auth.api.rackspacecloud.com/v1.0 '
'-U {cloudfiles_username} '
'-K {cloudfiles_api_key} '
'upload -c {cloudfiles_container} .'.format(**env))
@hosts(production)
def publish():
"""Publish to production via rsync"""
local('pelican -s publishconf.py')
project.rsync_project(
remote_dir=dest_path,
exclude=".DS_Store",
local_dir=DEPLOY_PATH.rstrip('/') + '/',
delete=True,
extra_opts='-c',
)
def gh_pages():
"""Publish to GitHub Pages"""
rebuild()
local("ghp-import -b {github_pages_branch} {deploy_path}".format(**env))
local("git push origin {github_pages_branch}".format(**env))
<!doctype html>
<html lang="en">
<head>
<title>Anton Sarukhanov {% if resource.meta.title-%}
| {{ resource.meta.title}}{%-endif %}</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="{{ media_url('css/style.css') }}">
</head>
<body>
<header>
{% set not_home = (content_url(resource.url) != content_url('index.html')) -%}
<h1>{% if not_home -%}<a href="{{ content_url('index.html') }}">{% endif -%}
Anton Sarukhanov{% if not_home %}</a>{% endif %}</h1>
</header>
<nav>
{% import "macros.j2" as macros with context -%}
{{ macros.render_main_menu()|indent(12) }}
</nav>
<article id="content">
{% filter markdown|indent(12) -%}
{% block content %}{% endblock %}
{%- endfilter %}
</article>
</body>
</html>
{# Generate menu from context (site.yaml) #}
{% macro render_main_menu() -%}<ul>
{% for menu_item in menu %}
<li><a {% if (menu_item.url == resource.relative_path) %}class="selected" {% endif -%}
href="{{ content_url(menu_item.url) }}">{{ menu_item.title }}</a></li>
{% endfor %}
</ul>
{%- endmacro %}
#!/usr/bin/env python
# -*- coding: utf-8 -*- #
from __future__ import unicode_literals
AUTHOR = 'Anton Sarukhanov'
SITENAME = 'ant.sr'
SITESUBTITLE = 'full-stack developer'
SITEURL = ''
PATH = 'content'
THEME = 'theme'
TIMEZONE = 'America/New_York'
DEFAULT_DATE = 'fs'
DEFAULT_PAGINATION = 10
# no feeds in dev
FEED_ALL_ATOM = None
CATEGORY_FEED_ATOM = None
TRANSLATION_FEED_ATOM = None
AUTHOR_FEED_ATOM = None
AUTHOR_FEED_RSS = None
FOO = "B4R"
# Blogroll
LINKS = (('Code', 'https://git.xhost.io/anton'),
('Resume', 'static/resume.pdf'),)
# Social widget
SOCIAL = (('Code', 'https://git.xhost.io/anton'),
('Facebook', 'https://facebook.com/ASarukhanov'),)
#!/usr/bin/env python
# -*- coding: utf-8 -*- #
from __future__ import unicode_literals
# This file is only used if you use `make publish` or
# explicitly specify it as your config file.
import os
import sys
sys.path.append(os.curdir)
from pelicanconf import *
SITEURL = ''
RELATIVE_URLS = False
FEED_ALL_ATOM = 'feeds/all.atom.xml'
CATEGORY_FEED_ATOM = 'feeds/%s.atom.xml'
DELETE_OUTPUT_DIRECTORY = True
PIWIK_URL = "analytics.ant.sr"
PIWIK_SITE_ID = 4
hyde==0.8.9
pelican==3.6.3
Markdown==2.6.6
mode: dev
media_root: media
media_url: /media
base_url: /
template: hyde.ext.templates.jinja.Jinja2Template
plugins:
- hyde.ext.plugins.meta.MetaPlugin
- hyde.ext.plugins.meta.AutoExtendPlugin
- hyde.ext.plugins.meta.SorterPlugin
- hyde.ext.plugins.meta.GrouperPlugin
- hyde.ext.plugins.urls.UrlCleanerPlugin
context:
data:
menu:
- title: Home
url: index.html
- title: Blog
url: blog/index.html
- title: Contact
url: contact.html
meta:
nodemeta: meta.yaml
default_block: content
sorter:
latest:
attr: meta.created
reverse: True
grouper:
category:
sorter: latest
description: Category
groups:
- name: basic
description: Basic
- name: advanced
description: Advanced
urlcleaner:
index_file_names:
- index.html
strip_extensions:
- html
append_slash: true
{% extends "base.html" %}
{% block content %}
<h1>Archives for {{ SITENAME }}</h1>
<dl>
{% for article in dates %}
<dt>{{ article.locale_date }}</dt>
<dd><a href="{{ SITEURL }}/{{ article.url }}">{{ article.title }}</a></dd>
{% endfor %}
</dl>
{% endblock %}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment