Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
54 changes: 25 additions & 29 deletions content/contents.lr
Original file line number Diff line number Diff line change
Expand Up @@ -56,81 +56,82 @@ is_block:
body:

#### text-block ####
title: ### One codebase. Multiple apps.
title: One codebase. Multiple apps.
----
text: BeeWare allows you to write your app in Python and release it on multiple platforms. No need to rewrite the app in multiple programming languages. It means **no issues** with build tools, environments, compatibility, etc.
----
image:
----
image_alignment: right

#### text-block ####
title: ### Python native tools...
title: Python native tools...
----
text: Python has proven itself as a highly capable language - approachable for newcomers, but powerful in the hands of experts. Why shouldn't you be able to **use Python everywhere** that you need to tell a computer to do something? And shouldn't your tools **exploit all the capabilities of Python** as a language, not just the bits that map nicely to a C binding?
----
image: python.png
----
image_alignment: right

#### text-block ####
title: ### ...on mobile & desktop...
title: ...on mobile & desktop...
----
text: Modern computing doesn't happen in an 80x25 console window. It happens on **phones, tablets, and desktop machines** with rich user interfaces. Shouldn't you be able to use Python in all those locations, and **exploit the unique capabilities of those platforms**?
----
image: cross-platform.png
----
image_alignment: left

#### text-block ####
title: ### ...behaving natively.
title: ...behaving natively.
----
text: End users shouldn't have to care what language their tools are written in. And that starts with looking and behaving **like completely native tools**. Native appearance, native behavior, delivered in the way a native app is delivered. Why shouldn't your Python tools fit in just as well as a native tool?
----
image: native.png
----
image_alignment: right

#### text-block ####
title: ## This is BeeWare.
title: This is BeeWare.
----
text: This is what BeeWare provides. Tools to help you write Python code with a rich, **native user interface**; and the libraries and support code necessary to get that code running on **iOS, Android, macOS, Linux, Windows, tvOS, and more**.
----
image: brutus-97.png
----
image_alignment: left

#### text-block ####
title: ### Open source
title: Open source
----
text: The Open Source development process has proven itself to be the most reliable way to develop robust and reliable software. That's why the entire BeeWare suite of tools are BSD licensed, and **available for all to use and modify**.
----
image: opensource.png
----
image_alignment: right

#### text-block ####
title: ### All contributions welcome
title: All contributions welcome
----
text: But it's not just about code. A successful software project requires documentation, design skills, feedback and bug reports. The BeeWare community acknowledges that **all contributions are important** — not just the ones that come as a pull request on GitHub.
----
image: labhr.png
----
image_alignment: left

#### text-block ####
title: ### From diversity comes strength
title: From diversity comes strength
----
text: A diverse community is a strong community. This means accepting people of all levels of experience, from all backgrounds, of all races, creeds, orientations and expressions. The BeeWare project is committed to **developing and maintaining a diverse, welcoming community**. We have an **open offer to mentor anyone** who wants to get involved as a contributor, backed up by a [Code of Conduct](community/behavior/code-of-conduct/) that is rigorously enforced.
----
image: diversity.png
----
image_alignment: right

#### text-block ####
title: Contribute!
----
text: If all this sounds interesting, why not take a look at the [BeeWare projects](/project) and see how you can use them when developing Python applications? Or, if you'd like to contribute, and you've never contributed to open source before, start with our [guide for first time contributors](/contributing/first-time/). If you feel ready to dive straight in, check out the [project pages](/project/) or our guide on [what you can do to help](/contributing/).
----
image:
----
image_alignment:

#### button-block ####
label:

Contribute to BeeWare
Contribute to BeeWare
----
link: /contributing/
----
Expand All @@ -141,14 +142,12 @@ type: primary
size: lg
----
is_block: yes

#### text-block ####
title: ### Stay in touch!
title: Stay in touch!
----
text: Follow [@beeware@fosstodon.org](https://fosstodon.org/@beeware) on Mastodon, or [join the BeeWare enthusiasts mailing list](/community/keep-informed/) for updates, hints, tips, and announcements related to the project.
----
image:
----
image_alignment:

#### button-block ####
label: Keep in touch!
----
Expand All @@ -161,15 +160,12 @@ type: success
size: lg
----
is_block: yes

#### text-block ####
title: ### Members
----
text: BeeWare is supported by users like you! Every little bit helps: [click here to contribute](/membership/).
----
image:
title: Members
----
image_alignment:
text: BeeWare is supported by users like you! Every little bit helps: [click here to contribute](/membership/).
---
gutter_top:
---
gutter_bottom: ### [... and many more](/project/)
gutter_bottom: [... and many more](/project/)
5 changes: 1 addition & 4 deletions databags/translate.ini
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,7 @@
; Breadcrumbs
home = Home
edit_on_github = Edit on GitHub
create_on_github = Translate on GitHub
translation_out_of_date = This translation of the original content is out of date!
see_original_content = See what changed in the original content
update_translation = Update translation on Github
edit_translation = Translate on Weblate

; Footer
sitemap = Sitemap
Expand Down
3 changes: 1 addition & 2 deletions flowblocks/text-block.ini
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,7 @@ button_label = Rich Text

[fields.title]
label = Title
description = Markdown
type = markdown
type = text
translate = True

[fields.text]
Expand Down
195 changes: 2 additions & 193 deletions packages/lektor_beeware_plugin/lektor_beeware_plugin.py
Original file line number Diff line number Diff line change
@@ -1,205 +1,14 @@
# -*- coding: utf-8 -*-
"""This is a custom local plugin to ad extra functionality to BeeWare site."""
"""This is a custom local plugin to add extra functionality to BeeWare site."""

# Standard library imports
from datetime import datetime, date
import os
import subprocess
import sys
from urllib.parse import quote_plus
from datetime import date

# Third party imports
from lektor.pluginsystem import Plugin
from lektor.db import Record
from markupsafe import Markup
from pygments import highlight
from pygments import lexers
from pygments.formatters import HtmlFormatter
from pygments.styles import get_all_styles


PY3 = sys.version_info[0] == 3


class BeeWarePlugin(Plugin):
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No objection to having this if there's no other option - but is there no pre-existing plugin that will give "today's date" as a context variable? It seems like one of those things that is so common it must exist...

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It may very well... That said, I've also been working, in parallel, on a plugin to provide a more convenient filter replacing our current translation macro. Might as well feed two birds with one scone.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why are we wasting perfectly good scones on the birds? 🤣

Did you want to roll that new plugin into this, or land this version of a vastly-minimised plugin, and replace it in the next pass?

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Well it's much nicer than stones : )

I think it would be a much simpler PR to review (and verify nothing is out of order) if done separately.

name = 'BeeWare Custom Lektor Plugin'
description = 'This is a custom local plugin to add extra functionality.'

DATE_FORMAT = "%Y-%m-%d %H:%M:%S"
EXECUTE_CACHE = {}

def on_setup_env(self, **extra):

# --- Helper methods
# ---------------------------------------------------------------------
def execute(cmd):
"""Execute a cmd (list) and return the stdout and stderr."""
joined_cmd = ' '.join(cmd)
if joined_cmd in self.EXECUTE_CACHE:
stdout, stderr = self.EXECUTE_CACHE[joined_cmd]
else:
stdout, stderr = None, None
try:
p = subprocess.Popen(cmd, stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
stdout, stderr = p.communicate()

if PY3:
if stdout:
stdout = stdout.decode()
if stderr:
stderr = stderr.decode()

except OSError:
print('\nCommand not found!\n')
print(joined_cmd)
print('\n')
except Exception as e:
print(e)
print('\n')

self.EXECUTE_CACHE[joined_cmd] = (stdout, stderr)

return stdout, stderr

def git_commits(filepath, since):
"""Get git commit hashes for `filepath` `since` a given date."""
cmd = ('git', 'log', '--since="'+since+'"', '--pretty=format:%H',
'--', filepath)
stdout, stderr = execute(cmd)

commits = []
if stdout:
commits = [c for c in stdout.split('\n') if c]

return commits

def git_diff(filepath, since):
"""Get git diff for a given `filepath` `since` a given date."""
html_diff = None
commits = git_commits(filepath, since)
if commits:
cmd = ('git', '--no-pager', 'diff', commits[-1]+'^', '--',
filepath)
stdout, stderr = execute(cmd)

if stdout:
html_diff = highlight(stdout, lexers.DiffLexer(),
HtmlFormatter())

# print(' '.join(cmd))
# print(diff)
# print('\n')

return html_diff

def git_modified_date(filepath):
"""Get last modified date of `filepath` from git."""
git_mod_date = None

if os.path.isfile(filepath):
cmd = ('git', 'log', '-1',
'--date=format:"'+self.DATE_FORMAT+'"',
'--format="%ad"', filepath)
stdout, stderr = execute(cmd)

if stdout:
stdout = stdout.split('\n')[0]
stdout = stdout.replace('"', '')
stdout = stdout.replace("'", '')

if stdout:
git_mod_date = datetime.strptime(stdout, self.DATE_FORMAT)

# print(' '.join(cmd))
# print(git_mod_date)
# print('\n')

return git_mod_date

# --- Exposed methods
# ---------------------------------------------------------------------
def get_pygments_css_styles(style='default'):
"""Get pygments CSS."""
class_name = '.highlight'
css = None
if style in get_all_styles():
cmd = ('pygmentize', '-S', style, '-f', 'html', '-a',
class_name)
stdout, stderr = execute(cmd)
css = '<style>{}</style>'.format(stdout)

return css

def is_alt_outdated(record):
"""Check if record alternative is outdated."""
return _alt_outdated_diff(record, return_diff=False)

def alt_outdated_diff(record):
"""Check if record alternative is outdated and returns the diff."""
return _alt_outdated_diff(record, return_diff=True)

def _alt_outdated_diff(record, return_diff=True):
"""Check if record alternative is outdated and returns the diff."""
if not isinstance(record, Record):
raise ValueError('Must provide a `Record` object')

config = self.env.jinja_env.globals['config']
site = self.env.jinja_env.globals['site']
primary_path = site.get(record.path, alt="_primary").contents.filename
primary_path = primary_path.replace(
'+{0}.lr'.format(config.primary_alternative), '.lr')
try:
alt_path = record.contents.filename
alt_text = '+{0}.lr'.format(config.primary_alternative)
if alt_text in alt_path:
alt_path = alt_path.replace(alt_text, '.lr')
except IOError:
# This means the alt content file does not exist
alt_path = None

primary_modtime = None
if os.path.isfile(primary_path):
# primary_modtime = os.path.getmtime(primary_path)
primary_modtime = git_modified_date(primary_path)

alt_modtime = None
if os.path.isfile(alt_path):
# alt_modtime = os.path.getmtime(alt_path)
alt_modtime = git_modified_date(alt_path)

diff = None
if alt_modtime and primary_modtime > alt_modtime and return_diff:
diff = git_diff(primary_path,
alt_modtime.strftime(self.DATE_FORMAT))

if not return_diff:
diff = alt_modtime and primary_modtime > alt_modtime

return diff

def urlencode_limit(string, limit=6000):
"""Encodes url for uri but if over limit returns None."""
if type(string) == 'Markup':
string = string.unescape()

if len(string) <= limit:
string = string.encode('utf8')
string = quote_plus(string)
string = Markup(string)
else:
string = None

return string

# Add additional methods to the environment globlas
self.env.jinja_env.globals.update(is_alt_outdated=is_alt_outdated)
self.env.jinja_env.globals.update(alt_outdated_diff=alt_outdated_diff)
self.env.jinja_env.globals.update(urlencode_limit=urlencode_limit)
self.env.jinja_env.globals.update(
get_pygments_css_styles=get_pygments_css_styles)

self.env.jinja_env.globals['today'] = date.today()

# Add some python builtins that are good for debugging
self.env.jinja_env.globals.update(dir=dir)
2 changes: 1 addition & 1 deletion packages/lektor_beeware_plugin/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ keywords = [
"plugin",
"static-site",
]
dependencies = ["Lektor", "MarkupSafe", "Pygments"]
dependencies = ["Lektor"]

[project.urls]
Source = "https://github.com/beeware/beeware.github.io/tree/lektor/packages/lektor_beeware_plugin"
Expand Down
3 changes: 2 additions & 1 deletion templates/blocks/text-block.html
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
{% if this.title %}<h3>{{ this.title }}</h3>{% endif %}
<p>{% if this.image %}<img src="{{ this.record.path }}{{ this.image }}" class="hidden-sm-down p-3 float-{{ this.image_alignment }}">{% endif %} {{ this.text }}</p>
<p>{% if this.image %}<img src="{{ this.record.path }}{{ this.image }}" class="hidden-sm-down p-3 float-{{ this.image_alignment }}">{% endif %}</p>
{{ this.text }}
2 changes: 1 addition & 1 deletion templates/home.html
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
<div class="col-sm-12 col-md-8">
<h1 class="display-1">BeeWare</h1>
<h2 class="display-2">{{ this.title }}</h2>
<p>{{ this.description }}</p>
{{ this.description }}
<p class="jumbotron-buttons">
{% for blk in this.header.blocks %}
{{ blk }}
Expand Down
Loading