Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
105 changes: 103 additions & 2 deletions buster/buster.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

Usage:
buster.py setup [--gh-repo=<repo-url>] [--dir=<path>]
buster.py generate [--domain=<local-address>] [--dir=<path>]
buster.py generate [--domain=<local-address>] [--dir=<path>] [--no-assets-versioning] [--rss-summaries] [--create-sitemap] [--site-url=<URL>]
buster.py preview [--dir=<path>]
buster.py deploy [--dir=<path>]
buster.py add-domain <domain-name> [--dir=<path>]
Expand All @@ -15,15 +15,22 @@
--dir=<path> Absolute path of directory to store static pages.
--domain=<local-address> Address of local ghost installation [default: local.tryghost.org].
--gh-repo=<repo-url> URL of your gh-pages repository.
--no-assets-versioning Remove version info from the filename of assets.
--rss-summaries Show only summaries in the rss feed
--create-sitemap Generate an xml site map
--site-url=<URL> URL of the website
"""

import os
import re
import sys
import shutil
import platform
import SocketServer
import SimpleHTTPServer
import xml.etree.ElementTree as ElementTree
from docopt import docopt
from datetime import date
from time import gmtime, strftime
from git import Repo

Expand All @@ -36,16 +43,32 @@ def main():
static_path = os.path.join(os.getcwd(), 'static')

if arguments['generate']:
command = ("wget \\"
if platform.system() == "Windows":
command = ("wget "
"--recursive " # follow links to download entire site
"--convert-links " # make links relative
"--page-requisites " # grab everything: css / inlined images
"--no-parent " # don't go to parent level
"--directory-prefix {1} " # download contents to static/ folder
"--no-host-directories " # don't create domain named folder
"{0}").format(arguments['--domain'], static_path)
else:
command = ("wget \\"
"--recursive \\" # follow links to download entire site
"--convert-links \\" # make links relative
"--page-requisites \\" # grab everything: css / inlined images
"--no-parent \\" # don't go to parent level
"--directory-prefix {1} \\" # download contents to static/ folder
"--no-host-directories \\" # don't create domain named folder
"{0}").format(arguments['--domain'], static_path)

os.system(command)

no_versioning = False
if arguments["--no-assets-versioning"]:
no_versioning = True
versioned_assets = []

# remove query string since Ghost 0.4
file_regex = re.compile(r'.*?(\?.*)')
for root, dirs, filenames in os.walk(static_path):
Expand All @@ -55,6 +78,84 @@ def main():
print "Rename", filename, "=>", newname
os.rename(os.path.join(root, filename), os.path.join(root, newname))

if no_versioning and ("@v=" in filename):
versioned_assets.append(filename)

if no_versioning:
for root, dirs, filenames in os.walk(static_path):
for filename in filenames:
data = None
with open(os.path.join(root, filename), 'r') as open_file:
data = open_file.read()
for asset_file in versioned_assets:
new_filename = asset_file.split("@v=", 1)[0]
data = data.replace(asset_file, new_filename)
with open(os.path.join(root, filename), 'w') as open_file:
open_file.write(data)
if filename in versioned_assets:
os.rename(os.path.join(root, filename), os.path.join(root, filename.split("@v=", 1)[0]))

if arguments["--create-sitemap"]:
if arguments['--site-url']:
site_url = arguments['--site-url']
else:
site_url = raw_input("Enter the website URL: ").strip()
if not ("http" in site_url):
site_url = "http://" + site_url

date_today = date.today()
site_map = ""
site_map_header = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\n"
site_map_footer = "</urlset>"
for root, dirs, filenames in os.walk(static_path):
for filename in filenames:
if ".html" in filename:
section = " <url>\n"
section = section + " <loc>" + site_url + (root[len(static_path):]+"\\"+filename).replace("\\","/") + "</loc>\n"
section = section + " <lastmod>%04d-%02d-%02d</lastmod>\n" % (date_today.year, date_today.month, date_today.day)
section = section + " <changefreq>monthly</changefreq>\n"
section = section + " </url>\n"
site_map = site_map + section

site_map = site_map_header + site_map + site_map_footer
with open(static_path + "\\sitemap.xml", 'w') as file_sitemap:
file_sitemap.write(site_map)
file_sitemap.close()

if arguments["--rss-summaries"]:
original_escape_cdata = ElementTree._escape_cdata
def _escape_cdata(text, encoding):
if "<![CDATA[" in text:
try:
return text.encode(encoding, "xmlcharrefreplace")
except (TypeError, AttributeError):
ElementTree._raise_serialization_error(text)
else:
return original_escape_cdata(text, encoding)
ElementTree._escape_cdata = _escape_cdata

for root, dirs, filenames in os.walk(static_path):
if root.rsplit("\\", 1)[1] == "rss":
tree = ElementTree.parse(os.path.join(root, filename))
xml_root = tree.getroot()
is_title = True
for description in xml_root.iter("description"):
if is_title:
is_title = False
else:
summary = description.text
#modify the summary
summary = " ".join(summary.split()[:50]) + " ..."

#limit summary to one paragraph
if "<p>" in summary:
summary = summary.split("</p>",1)[0]
summary = summary + "</p>"
summary = "<![CDATA[" + summary + "]]>"

description.text = summary
tree.write(os.path.join(root, filename))

elif arguments['preview']:
os.chdir(static_path)

Expand Down