diff --git a/buster/buster.py b/buster/buster.py index 0b4fac7..6ef7734 100644 --- a/buster/buster.py +++ b/buster/buster.py @@ -2,7 +2,7 @@ Usage: buster.py setup [--gh-repo=] [--dir=] - buster.py generate [--domain=] [--dir=] + buster.py generate [--domain=] [--dir=] [--no-assets-versioning] [--rss-summaries] [--create-sitemap] [--site-url=] buster.py preview [--dir=] buster.py deploy [--dir=] buster.py add-domain [--dir=] @@ -15,15 +15,22 @@ --dir= Absolute path of directory to store static pages. --domain= Address of local ghost installation [default: local.tryghost.org]. --gh-repo= 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 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 @@ -36,7 +43,17 @@ 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 @@ -44,8 +61,14 @@ def main(): "--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): @@ -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 = "\n\n" + site_map_footer = "" + for root, dirs, filenames in os.walk(static_path): + for filename in filenames: + if ".html" in filename: + section = " \n" + section = section + " " + site_url + (root[len(static_path):]+"\\"+filename).replace("\\","/") + "\n" + section = section + " %04d-%02d-%02d\n" % (date_today.year, date_today.month, date_today.day) + section = section + " monthly\n" + section = section + " \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 "" in summary: + summary = summary.split("

",1)[0] + summary = summary + "

" + summary = "" + + description.text = summary + tree.write(os.path.join(root, filename)) + elif arguments['preview']: os.chdir(static_path)