From aa62e4c6629416ba4e4198d0b75932a5bb262e0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Chris=20=E2=80=9CKwpolska=E2=80=9D=20Warrick?= Date: Thu, 23 Jan 2014 19:07:26 +0100 Subject: [PATCH] Add an install_bs3 command for Debian. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Chris “Kwpolska” Warrick --- nikola/conf.py.in | 2 + nikola/plugins/command/init.py | 2 +- nikola/plugins/command/install_bs3.plugin | 9 ++ nikola/plugins/command/install_bs3.py | 110 ++++++++++++++++++++++ 4 files changed, 122 insertions(+), 1 deletion(-) create mode 100644 nikola/plugins/command/install_bs3.plugin create mode 100644 nikola/plugins/command/install_bs3.py diff --git a/nikola/conf.py.in b/nikola/conf.py.in index 0aeb97b931..15a0ca6d65 100644 --- a/nikola/conf.py.in +++ b/nikola/conf.py.in @@ -312,6 +312,8 @@ COMPILERS = ${COMPILERS} # the main (the newest) index page (index.html) # Name of the theme to use. +# WARNING: With this Nikola package, the bootstrap3 theme must be installed +# separately. In order to do this, use: nikola install_bs3 THEME = ${THEME} # Color scheme to be used for code blocks. If your theme provides diff --git a/nikola/plugins/command/init.py b/nikola/plugins/command/init.py index d7eeed701e..29eebcfcb6 100644 --- a/nikola/plugins/command/init.py +++ b/nikola/plugins/command/init.py @@ -47,7 +47,7 @@ 'BLOG_EMAIL': "joe@demo.site", 'BLOG_DESCRIPTION': "This is a demo site for Nikola.", 'DEFAULT_LANG': "en", - 'THEME': 'bootstrap3', + 'THEME': 'bootstrap', 'COMMENT_SYSTEM': 'disqus', 'COMMENT_SYSTEM_ID': 'nikolademo', 'TRANSLATIONS_PATTERN': DEFAULT_TRANSLATIONS_PATTERN, diff --git a/nikola/plugins/command/install_bs3.plugin b/nikola/plugins/command/install_bs3.plugin new file mode 100644 index 0000000000..77730cc615 --- /dev/null +++ b/nikola/plugins/command/install_bs3.plugin @@ -0,0 +1,9 @@ +[Core] +Name = install_bs3 +Module = install_bs3 + +[Documentation] +Author = Roberto Alsina, Chris Warrick +Version = 0.1 +Website = http://getnikola.com +Description = Install the bootstrap3 theme into the current site. diff --git a/nikola/plugins/command/install_bs3.py b/nikola/plugins/command/install_bs3.py new file mode 100644 index 0000000000..98fb80e723 --- /dev/null +++ b/nikola/plugins/command/install_bs3.py @@ -0,0 +1,110 @@ +# -*- coding: utf-8 -*- + +# Copyright © 2012-2014 Roberto Alsina, Chris Warrick and others. + +# Permission is hereby granted, free of charge, to any +# person obtaining a copy of this software and associated +# documentation files (the "Software"), to deal in the +# Software without restriction, including without limitation +# the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the +# Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice +# shall be included in all copies or substantial portions of +# the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY +# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +# PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS +# OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR +# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +# OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +from __future__ import print_function +import os +import json +import shutil +from io import BytesIO + +try: + import requests +except ImportError: + requests = None # NOQA + +from nikola.plugin_categories import Command +from nikola import utils + +LOGGER = utils.get_logger('install_theme', utils.STDERR_HANDLER) + + +# Stolen from textwrap in Python 3.3.2. +def indent(text, prefix, predicate=None): # NOQA + """Adds 'prefix' to the beginning of selected lines in 'text'. + + If 'predicate' is provided, 'prefix' will only be added to the lines + where 'predicate(line)' is True. If 'predicate' is not provided, + it will default to adding 'prefix' to all non-empty lines that do not + consist solely of whitespace characters. + """ + if predicate is None: + def predicate(line): + return line.strip() + + def prefixed_lines(): + for line in text.splitlines(True): + yield (prefix + line if predicate(line) else line) + return ''.join(prefixed_lines()) + + +class CommandInstallThemeBS3(Command): + """Install a theme. Bootstrap 3, to be precise.""" + + name = "install_bs3" + doc_usage = "" + doc_purpose = "install bootstrap3 into the current site" + output_dir = 'themes' + cmd_options = [] + + def _execute(self, options, args): + """Install theme into current site.""" + if requests is None: + utils.req_missing(['requests'], 'install the bootstrap3 theme') + + url = 'http://themes.getnikola.com/bs3/v7.0.0/bs3.json' + name = 'bootstrap3' + + data = requests.get(url).text + data = json.loads(data) + installstatus = self.do_install(name, data) + if installstatus: + LOGGER.notice('Remember to set THEME="bootstrap3" in conf.py if you want to use it.') + + def do_install(self, name, data): + if name in data: + utils.makedirs(self.output_dir) + LOGGER.notice('Downloading: ' + data[name]) + zip_file = BytesIO() + zip_file.write(requests.get(data[name]).content) + LOGGER.notice('Extracting: {0} into themes'.format(name)) + utils.extract_all(zip_file) + dest_path = os.path.join('themes', name) + else: + try: + theme_path = utils.get_theme_path(name) + except: + LOGGER.error("Can't find theme " + name) + return False + + utils.makedirs(self.output_dir) + dest_path = os.path.join(self.output_dir, name) + if os.path.exists(dest_path): + LOGGER.error("{0} is already installed".format(name)) + return False + + LOGGER.notice('Copying {0} into themes'.format(theme_path)) + shutil.copytree(theme_path, dest_path) + return True