aboutsummaryrefslogtreecommitdiffstats
path: root/nikola/plugins/command/bootswatch_theme.py
diff options
context:
space:
mode:
Diffstat (limited to 'nikola/plugins/command/bootswatch_theme.py')
-rw-r--r--nikola/plugins/command/bootswatch_theme.py103
1 files changed, 103 insertions, 0 deletions
diff --git a/nikola/plugins/command/bootswatch_theme.py b/nikola/plugins/command/bootswatch_theme.py
new file mode 100644
index 0000000..eb27f94
--- /dev/null
+++ b/nikola/plugins/command/bootswatch_theme.py
@@ -0,0 +1,103 @@
+# -*- coding: utf-8 -*-
+
+# Copyright © 2012-2013 Roberto Alsina 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
+
+try:
+ import requests
+except ImportError:
+ requests = None # NOQA
+
+from nikola.plugin_categories import Command
+from nikola import utils
+
+LOGGER = utils.get_logger('bootswatch_theme', utils.STDERR_HANDLER)
+
+
+class CommandBootswatchTheme(Command):
+ """Given a swatch name from bootswatch.com and a parent theme, creates a custom theme."""
+
+ name = "bootswatch_theme"
+ doc_usage = "[options]"
+ doc_purpose = "given a swatch name from bootswatch.com and a parent theme, creates a custom"\
+ " theme"
+ cmd_options = [
+ {
+ 'name': 'name',
+ 'short': 'n',
+ 'long': 'name',
+ 'default': 'custom',
+ 'type': str,
+ 'help': 'New theme name (default: custom)',
+ },
+ {
+ 'name': 'swatch',
+ 'short': 's',
+ 'default': 'slate',
+ 'type': str,
+ 'help': 'Name of the swatch from bootswatch.com.'
+ },
+ {
+ 'name': 'parent',
+ 'short': 'p',
+ 'long': 'parent',
+ 'default': 'bootstrap3',
+ 'help': 'Parent theme name (default: bootstrap3)',
+ },
+ ]
+
+ def _execute(self, options, args):
+ """Given a swatch name and a parent theme, creates a custom theme."""
+ if requests is None:
+ utils.req_missing(['requests'], 'install Bootswatch themes')
+
+ name = options['name']
+ swatch = options['swatch']
+ parent = options['parent']
+ version = ''
+
+ # See if we need bootswatch for bootstrap v2 or v3
+ themes = utils.get_theme_chain(parent)
+ if 'bootstrap3' not in themes:
+ version = '2'
+ elif 'bootstrap' not in themes:
+ LOGGER.warn('"bootswatch_theme" only makes sense for themes that use bootstrap')
+
+ LOGGER.notice("Creating '{0}' theme from '{1}' and '{2}'".format(name, swatch, parent))
+ utils.makedirs(os.path.join('themes', name, 'assets', 'css'))
+ for fname in ('bootstrap.min.css', 'bootstrap.css'):
+ url = '/'.join(('http://bootswatch.com', version, swatch, fname))
+ LOGGER.notice("Downloading: " + url)
+ data = requests.get(url).text
+ with open(os.path.join('themes', name, 'assets', 'css', fname),
+ 'wb+') as output:
+ output.write(data.encode('utf-8'))
+
+ with open(os.path.join('themes', name, 'parent'), 'wb+') as output:
+ output.write(parent.encode('utf-8'))
+ LOGGER.notice('Theme created. Change the THEME setting to "{0}" to use '
+ 'it.'.format(name))