[geany/www.geany.org] 668492: Add Geany-Themes page with theme preview
Enrico Tröger
git-noreply at xxxxx
Sun Jun 30 12:08:45 UTC 2019
Branch: refs/heads/issue5_geany_themes_preview
Author: Enrico Tröger <enrico.troeger at uvena.de>
Committer: Enrico Tröger <enrico.troeger at uvena.de>
Date: Sun, 30 Jun 2019 12:08:45 UTC
Commit: 668492803592cde2c30254b0dbc5fb61001187f7
https://github.com/geany/www.geany.org/commit/668492803592cde2c30254b0dbc5fb61001187f7
Log Message:
-----------
Add Geany-Themes page with theme preview
The themes in the preview list are loaded from the Geany-Themes
repository on Github on the fly (but cached for one hour).
Modified Paths:
--------------
geany/templates/home.html
page_content/download/themes.md
static_docs/github_client.py
static_docs/templates/pages/download/themes.html
static_docs/urls.py
static_docs/views.py
Modified: geany/templates/home.html
2 lines changed, 1 insertions(+), 1 deletions(-)
===================================================================
@@ -151,7 +151,7 @@ <h2 class="text-center">Great Community</h2>
<h2 class="text-center">Easily Customizable</h2>
<p>
Many parts of Geany are heavily customizable like color themes
- (<a href="https://github.com/geany/geany-themes">Geany Themes project</a>) or
+ (<a href="{% url "page" "download/themes" %}">Geany Themes</a>) or
adding new filetypes.
</p>
<p>
Modified: page_content/download/themes.md
10 lines changed, 10 insertions(+), 0 deletions(-)
===================================================================
@@ -0,0 +1,10 @@
+## Geany Themes
+
+Geany-Themes is a collection of color schemes for Geany, either written originally by the Geany community or ported from color schemes for other editors.
+These schemes are compatible with Geany 1.22 and greater.
+
+To use one the themes below, download the configuration file and save it to the folder `colorschemes` in your Geany configuration directory (usually `~/.config/geany/colorschemes/`).
+
+For more information and detailed configuration instructions, see https://github.com/geany/geany-themes.
+
+
Modified: static_docs/github_client.py
8 lines changed, 5 insertions(+), 3 deletions(-)
===================================================================
@@ -30,9 +30,11 @@ class GitHubApiClient:
""""""
# ----------------------------------------------------------------------
- def get_file_contents(self, filename):
- url_parameters = dict(user=GITHUB_USER,
- repository=GITHUB_REPOSITORY,
+ def get_file_contents(self, filename, user=None, repository=None):
+ user = user or GITHUB_USER
+ repository = repository or GITHUB_REPOSITORY
+ url_parameters = dict(user=user,
+ repository=repository,
filename=filename)
url = 'https://api.github.com/repos/%(user)s/%(repository)s/contents/%(filename)s' % \
url_parameters
Modified: static_docs/templates/pages/download/themes.html
63 lines changed, 63 insertions(+), 0 deletions(-)
===================================================================
@@ -0,0 +1,63 @@
+{% extends "pages/richtextpage.html" %}
+
+{% load mezzanine_tags pages_tags static %}
+
+{% block extra_css %}
+<link rel="stylesheet" href="{% static "mezzanine/css/magnific-popup.css" %}">
+<style>
+ .img-thumbnail {
+ cursor: zoom-in;
+ }
+</style>
+{% endblock %}
+
+{% block richtext_content %}
+{{ block.super }}
+
+<h3>Available Themes</h3>
+
+<div class="row">
+
+{% for theme in theme_index.values|dictsort:"name" %}
+ <div class="col-md-4">
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ <strong>{{ theme.name }}</strong>
+ <span class="pull-right"><a href="{{ theme.colorscheme }}">Download</a></span>
+ </div>
+ <div class="panel-body gallery">
+ <a href="{{ theme.screenshot }}" title="{{ theme.name }} - {{ theme.description }}">
+ <img
+ src="data:image/png;base64,{{ theme.thumbnail }}"
+ class="img-responsive img-thumbnail center-block"
+ alt="Thumbnail of colorscheme {{ theme.name }}" />
+ </a>
+ <div class="text-center">{{ theme.description }}</div>
+ </div>
+ </div>
+ </div>
+
+ {% if forloop.counter|divisibleby:3 %}
+ </div>
+ <div class="row">
+ {% endif %}
+{% endfor %}
+</div>
+
+{% endblock %}
+
+{% block extra_js %}
+{{ block.super }}
+<script src="{% static "mezzanine/js/magnific-popup.js" %}"></script>
+<script>
+$(document).ready(function() {
+ $('.gallery').magnificPopup({
+ delegate: 'a',
+ type: 'image',
+ gallery: {
+ enabled: true,
+ }
+ });
+});
+</script>
+{% endblock %}
Modified: static_docs/urls.py
4 lines changed, 3 insertions(+), 1 deletions(-)
===================================================================
@@ -14,10 +14,12 @@
from django.conf.urls import url
-from static_docs.views import I18NStatisticsView, ReleaseNotesView, ToDoView
+from static_docs.views import I18NStatisticsView, ReleaseNotesView, ThemesView, ToDoView
urlpatterns = ( # pylint: disable=invalid-name
+ url(r'^download/themes/$', ThemesView.as_view(), name='themes'),
+
url(r'^documentation/todo/$', ToDoView.as_view(), name='todo'),
url(r'^documentation/releasenotes/$', ReleaseNotesView.as_view(), name='releasenotes'),
Modified: static_docs/views.py
64 lines changed, 62 insertions(+), 2 deletions(-)
===================================================================
@@ -19,6 +19,7 @@
import re
from django.conf import settings
+from django.core.cache import cache
from django.http import Http404
from django.views.generic.base import TemplateView
from mezzanine_pagedown.filters import plain as markdown_plain
@@ -30,6 +31,9 @@
RELEASE_REGEXP = re.compile(r'^Geany (?P<version>[0-9\.]+) \((?P<date>.*)\)$')
DATE_PATTERNS_TO_BE_IGNORED = ('TBD', 'TBA', 'unreleased')
+CACHE_KEY_THEME_INDEX_MD5_HASH = 'THEME_INDEX_MD5_HASH'
+CACHE_KEY_THEME_INDEX = 'THEME_INDEX'
+
logger = logging.getLogger(__name__) # pylint: disable=invalid-name
@@ -56,9 +60,9 @@ def __init__(self, *args, **kwargs):
self._file_contents = None
# ----------------------------------------------------------------------
- def _fetch_file_via_github_api(self, filename):
+ def _fetch_file_via_github_api(self, filename, user=None, repository=None):
client = GitHubApiClient()
- self._file_contents = client.get_file_contents(filename)
+ self._file_contents = client.get_file_contents(filename, user=user, repository=repository)
class ReleaseNotesView(StaticDocsView):
@@ -240,3 +244,59 @@ def _get_i18n_statistics(self):
settings.STATIC_DOCS_GEANY_I18N_STATISTICS_FILENAME)
with open(filename) as input_file:
return json.load(input_file)
+
+
+class ThemesView(StaticDocsView):
+ """
+ Fetch the Geany-Themes index from https://github.com/geany/geany-themes/tree/master/index
+ """
+
+ template_name = "pages/download/themes.html"
+
+ # ----------------------------------------------------------------------
+ def get_context_data(self, **kwargs):
+ theme_index = self._get_theme_index()
+ context = super(ThemesView, self).get_context_data(**kwargs)
+ context['theme_index'] = theme_index
+ return context
+
+ # ----------------------------------------------------------------------
+ def _get_theme_index(self):
+ """
+ Refresh the theme index by:
+ - querying the MD5 hash from Github
+ - compare the freshly retrieved MD5 hash against the cached one
+ - load the whole theme index if:
+ - the MD5 hashes differ
+ - the MD5 hash was not retrieved yet or has been expired from cache
+ - the theme index was not retrieved yet or has been expired from cache
+ - after loading the whole theme index cache it long (24 hours)
+ - store the freshly retrieved MD5 hash in the cache
+ """
+ theme_index_md5_hash = self._query_theme_index_md5_hash()
+ cached_theme_index_md5_hash = cache.get(CACHE_KEY_THEME_INDEX_MD5_HASH)
+ theme_index = cache.get(CACHE_KEY_THEME_INDEX)
+
+ # theme index has been changed remotely?
+ if theme_index_md5_hash != cached_theme_index_md5_hash or theme_index is None:
+ logger.debug('Refresh theme index from Github (MD5: {})'.format(theme_index_md5_hash))
+ # query whole theme index
+ theme_index = self._query_parse_themes_index()
+ # cache it for later
+ cache.set(CACHE_KEY_THEME_INDEX, theme_index, CACHE_TIMEOUT_24HOURS)
+
+ # cache MD5 hash
+ cache.set(CACHE_KEY_THEME_INDEX_MD5_HASH, theme_index_md5_hash, CACHE_TIMEOUT_24HOURS)
+
+ return theme_index
+
+ # ----------------------------------------------------------------------
+ def _query_theme_index_md5_hash(self):
+ self._fetch_file_via_github_api('index/index.json.md5', repository='geany-themes')
+ return self._file_contents.strip()
+
+ # ----------------------------------------------------------------------
+ def _query_parse_themes_index(self):
+ self._fetch_file_via_github_api('index/index.json', repository='geany-themes')
+ theme_index = json.loads(self._file_contents)
+ return theme_index
--------------
This E-Mail was brought to you by github_commit_mail.py (Source: https://github.com/geany/infrastructure).
More information about the Commits
mailing list