From d5075664c8ed6ca24a4f020484d60b2e22040d11 Mon Sep 17 00:00:00 2001 | |
From: =?UTF-8?q?Chris=20=E2=80=9CKwpolska=E2=80=9D=20Warrick?= | |
<kwpolska@gmail.com> | |
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 <kwpolska@gmail.com> | |
--- | |
nikola/conf.py.in | 2 + | |
nikola/plugins/command/init.py | 2 +- | |
nikola/plugins/command/install_bs3.plugin | 10 +++ | |
nikola/plugins/command/install_bs3.py | 110 ++++++++++++++++++++++++++++++ | |
4 files changed, 123 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 d487ed1..4834468 100644 | |
--- a/nikola/conf.py.in | |
+++ b/nikola/conf.py.in | |
@@ -285,6 +285,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 96caad8..dc5ca2d 100644 | |
--- a/nikola/plugins/command/init.py | |
+++ b/nikola/plugins/command/init.py | |
@@ -64,7 +64,7 @@ class CommandInit(Command): | |
'BLOG_EMAIL': "joe@demo.site", | |
'BLOG_DESCRIPTION': "This is a demo site for Nikola.", | |
'DEFAULT_LANG': "en", | |
- 'THEME': 'bootstrap3', | |
+ 'THEME': 'bootstrap', | |
'POSTS': """( | |
("posts/*.rst", "posts", "post.tmpl"), | |
diff --git a/nikola/plugins/command/install_bs3.plugin b/nikola/plugins/command/install_bs3.plugin | |
new file mode 100644 | |
index 0000000..1773a07 | |
--- /dev/null | |
+++ b/nikola/plugins/command/install_bs3.plugin | |
@@ -0,0 +1,10 @@ | |
+[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 0000000..4060aef | |
--- /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/v6.3.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 | |
-- | |
1.8.5.3 | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment