From 9fd7a447a3b8ef46af764afa472816890bff8b9c Mon Sep 17 00:00:00 2001 From: Almar Klein Date: Thu, 10 Oct 2024 16:04:22 +0200 Subject: [PATCH] first site --- .gitignore | 4 + makesite.py | 388 +++++++++++++++++++++++++++++++++++++++++++++++ pages/index.md | 72 +++++++++ pages/sponsor.md | 47 ++++++ static/pygfx.png | Bin 0 -> 55421 bytes style.css | 259 +++++++++++++++++++++++++++++++ template.html | 36 +++++ 7 files changed, 806 insertions(+) create mode 100644 .gitignore create mode 100644 makesite.py create mode 100644 pages/index.md create mode 100644 pages/sponsor.md create mode 100644 static/pygfx.png create mode 100644 style.css create mode 100644 template.html diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ce191e3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.pyd +__pycache__ +.DS_Store +output/ \ No newline at end of file diff --git a/makesite.py b/makesite.py new file mode 100644 index 0000000..68f91b6 --- /dev/null +++ b/makesite.py @@ -0,0 +1,388 @@ +""" +Script to build a website from a bunch of markdown files. +Inspired by https://github.com/sunainapai/makesite +Tweaked for almarklein.org +Then for pygfx.org +""" + +import os +import shutil +import webbrowser + +import markdown +import pygments +from pygments.formatters import HtmlFormatter +from pygments.lexers import get_lexer_by_name + + +TITLE = "pygfx.org" + +NAV = { + "Main": "index", + "Sponsor": "sponsor", + # "Blog": "blog", + # "Archive": "archive", + # "Social": { + # 'Twitter': 'https://twitter.com/pygfx', + # }, +} + +NEWS = { + "Released pygfx v0.5.0": "https://github.com/pygfx/pygfx/releases/tag/v0.5.0", + "Released wgpu-py v0.18.1": "https://github.com/pygfx/wgpu-py/releases/tag/v0.18.1", +} + +THIS_DIR = os.path.dirname(os.path.abspath(__file__)) +OUT_DIR = os.path.join(THIS_DIR, "output") +STATIC_DIR = os.path.join(THIS_DIR, "static") +PAGES_DIR = os.path.join(THIS_DIR, "pages") +POSTS_DIR = os.path.join(THIS_DIR, "posts") + + +REDIRECT = '' + + +def create_menu(page): + """ Create the menu for the given page. + """ + menu = [""] + + menu.append('Pages') + for title, target in NAV.items(): + if isinstance(target, str): + if target.startswith(("https://", "http://", "/")): + menu.append(f"{title}") + else: + menu.append(f"{title}") + if target == page.name: + menu[-1] = menu[-1].replace("{title}") + if target.get("", None) == page.name: + menu[-1] = menu[-1].replace("{subtitle}") + else: + menu.append( + f"{subtitle}" + ) + if subtarget == page.name: + menu[-1] = menu[-1].replace("class='", "class='current ") + else: + raise RuntimeError(f"Unexpected NAV entry {type(target)}") + + subtitles = [title for level, title in page.headers if level == 2] + if subtitles: + menu.append("
Current page") + menu += [ + f"{title}" for title in subtitles + ] + + if NEWS: + menu.append('
News') + for title, url in NEWS.items(): + # menu.append(f"{title}") + menu.append(f"{title}") + + return "
".join(menu) + + +def create_blog_relatated_pages(posts): + """ Create blog overview page. + """ + + # Filter and sort + posts = [ + post for post in posts.values() if post.date and not post.name.startswith("_") + ] + posts.sort(key=lambda p: p.date) + + blogpages = {} + + # Generate overview page + html = ["

Blog

"] + for page in reversed(posts): + text = page.md + if "" in text: + summary = text.split("")[-1].split( + "" + )[0] + else: + summary = text.split("## ")[0] + summary = summary.split("-->")[-1] + + # html.append("
" + page.date_and_tags_html) + html.append("
" + page.date_and_tags_html + "
") + html.append(f'

{page.title}

') + if page.thumbnail: + html.append(f"") + # html.append(f'

{page.title}

') + html.append("

" + summary + "

") + html.append(f"read more ...

") + html.append("
") + blogpages["overview"] = "\n".join(html) + + # Generate archive page + year = "" + html = ["

Archive

\n"] + for page in reversed(posts): + if page.date[:4] != year: + year = page.date[:4] + html.append(f"

{year}

") + html.append(f'{page.date}: {page.title}
') + blogpages["archive"] = "\n".join(html) + + # todo: Generate page for each tag + + return blogpages + + +def create_assets(): + """ Returns a dict of all the assets representing the website. + """ + assets = {} + + # Load all static files + for root, dirs, files in os.walk(STATIC_DIR): + for fname in files: + filename = os.path.join(root, fname) + with open(filename, "rb") as f: + assets[os.path.relpath(filename, STATIC_DIR)] = f.read() + + # Collect pages + pages = {} + for fname in os.listdir(PAGES_DIR): + if fname.lower().endswith(".md"): + name = fname.split(".")[0].lower() + with open(os.path.join(PAGES_DIR, fname), "rb") as f: + md = f.read().decode() + pages[name] = Page(name, md) + + # Collect blog posts + posts = {} + for fname in os.listdir(POSTS_DIR): + if fname.lower().endswith(".md"): + name = fname.split(".")[0].lower() + assert name not in pages, f"blog post slug not allowed: {name}" + with open(os.path.join(POSTS_DIR, fname), "rb") as f: + md = f.read().decode() + posts[name] = Page(name, md) + + # Get template + with open(os.path.join(THIS_DIR, "template.html"), "rb") as f: + html_template = f.read().decode() + + with open(os.path.join(THIS_DIR, "style.css"), "rb") as f: + css = f.read().decode() + css += "/* Pygments CSS */\n" + HtmlFormatter(style="vs").get_style_defs( + ".highlight" + ) + + # Generate posts + for page in posts.values(): + page.prepare(pages.keys()) + title = page.title + menu = create_menu(page) + html = html_template.format( + title=title, style=css, body=page.to_html(), menu=menu + ) + print("generating post", page.name + ".html") + assets[page.name + ".html"] = html.encode() + + # Generate pages + for page in pages.values(): + page.prepare(pages.keys()) + title = TITLE if page.name == "index" else TITLE + " - " + page.title + menu = create_menu(page) + html = html_template.format( + title=title, style=css, body=page.to_html(), menu=menu + ) + print("generating page", page.name + ".html") + assets[page.name + ".html"] = html.encode() + + # Generate special pages + fake_md = "" # "##index\n## archive\n## tags" + for name, html in create_blog_relatated_pages(posts).items(): + name = "blog" if name == "overview" else name + print("generating page", name + ".html") + assets[f"{name}.html"] = html_template.format( + title=TITLE, style=css, body=html, menu=create_menu(Page("", fake_md)) + ).encode() + + # Backwards compat with previous site + for page in pages.values(): + assets["pages/" + page.name + ".html"] = REDIRECT.replace( + "URL", f"/{page.name}.html" + ).encode() + + # Fix backslashes on Windows + for key in list(assets.keys()): + if "\\" in key: + assets[key.replace("\\", "/")] = assets.pop(key) + + return assets + + +def main(): + """ Main function that exports the page to the file system. + """ + # Create / clean output dir + if os.path.isdir(OUT_DIR): + shutil.rmtree(OUT_DIR) + os.mkdir(OUT_DIR) + + # Write all assets to the directory + for fname, bb in create_assets().items(): + filename = os.path.join(OUT_DIR, fname) + dirname = os.path.dirname(filename) + if not os.path.isdir(dirname): + os.makedirs(dirname) + with open(filename, "wb") as f: + f.write(bb) + + +class Page: + """ Representation of a page. It takes in markdown and produces HTML. + """ + + def __init__(self, name, markdown): + self.name = name + self.md = markdown + self.parts = [] + self.headers = [] + + self.title = name + if markdown.startswith("# "): + self.title = markdown.split("\n")[0][1:].strip() + + self.date = None + if "")[0].strip() or None + if self.date is not None: + assert ( + len(self.date) == 10 and self.date.count("-") == 2 + ), f"Weird date in {name}.md" + + self.author = None + if "")[0].strip() + + self.tags = [] + if "")[0].split(",") + ] + + self.date_and_tags_html = "" + if self.date: + self.date_and_tags_html = f"{', '.join(self.tags)}  -  {self.date}" + + self.thumbnail = None + for fname in ["thumbs/" + self.name + ".jpg"]: + if os.path.isfile(os.path.join(THIS_DIR, "static", fname)): + self.thumbnail = fname + + def prepare(self, page_names): + # Convert markdown to HTML + self.md = self._fix_links(self.md, page_names) + self.md = self._highlight(self.md) + self._split() # populates self.parts and self.headers + + def _fix_links(self, text, page_names): + """ Fix the markdown links based on the pages that we know. + """ + for n in page_names: + text = text.replace(f"]({n})", f"]({n}.html)") + text = text.replace(f"]({n}.md)", f"]({n}.html)") + return text + + def _highlight(self, text): + """ Apply syntax highlighting. + """ + lines = [] + code = [] + for i, line in enumerate(text.splitlines()): + if line.startswith("```"): + if code: + formatter = HtmlFormatter() + try: + lexer = get_lexer_by_name(code[0]) + except Exception: + lexer = get_lexer_by_name("text") + lines.append( + pygments.highlight("\n".join(code[1:]), lexer, formatter) + ) + code = [] + else: + code.append(line[3:].strip()) # language + elif code: + code.append(line) + else: + lines.append(line) + return "\n".join(lines).strip() + + def _split(self): + """ Split the markdown into parts based on sections. + Each part is either text or a tuple representing a section. + """ + text = self.md + self.parts = parts = [] + self.headers = headers = [] + lines = [] + + # Split in parts + for line in text.splitlines(): + if line.startswith(("# ", "## ", "### ", "#### ", "##### ")): + # Finish pending lines + parts.append("\n".join(lines)) + lines = [] + # Process header + level = len(line.split(" ")[0]) + title = line.split(" ", 1)[1] + title_short = title.split("(")[0].split("<")[0].strip().replace("`", "") + headers.append((level, title_short)) + parts.append((level, title_short, title)) + else: + lines.append(line) + parts.append("\n".join(lines)) + + # Now convert all text to html + for i in range(len(parts)): + if not isinstance(parts[i], tuple): + parts[i] = markdown.markdown(parts[i], extensions=[]) + "\n\n" + + def to_html(self): + htmlparts = [] + for part in self.parts: + if isinstance(part, tuple): + level, title_short, title = part + title_html = ( + title.replace("``", "`") + .replace("`", "", 1) + .replace("`", "", 1) + ) + ts = title_short.lower() + if part[0] == 1: + htmlparts.append(self.date_and_tags_html) + htmlparts.append("

%s

" % title_html) + elif part[0] == 2 and title_short: + htmlparts.append( + "".format(ts, ts) + ) + htmlparts.append("%s" % (level, title_html, level)) + htmlparts.append("") + else: + htmlparts.append("%s" % (level, title_html, level)) + else: + htmlparts.append(part) + return "\n".join(htmlparts) + + +if __name__ == "__main__": + main() + # webbrowser.open(os.path.join(OUT_DIR, "index.html")) diff --git a/pages/index.md b/pages/index.md new file mode 100644 index 0000000..4f09dd1 --- /dev/null +++ b/pages/index.md @@ -0,0 +1,72 @@ + +pygfx.org + + +## ๐Ÿ’ซ Projects + +
+

Pygfx

+ + A powerful render engine for Python

+ Repo: github.com/pygfx/pygfx
+ Docs: pygfx.readthedocs.io
+
+ +
+

wgpu-py

+ + WebGPU for Python

+ Repo: github.com/pygfx/wgpu
+ Docs: wgpu-py.readthedocs.io
+
+ +
+

Other

+ Projects that we also contribute to

+ wgpu-native
+ jupyter_rfb
+ pylinalg +
+ + +## ๐Ÿš€ Mission + +We are dedicated to bring powerful and reliable visualization to the Python world. + +We believe that wgpu is the future for graphics and bring it to Python with the wgpu-py library. On top of that, we build pygfx: a modern, versatile, and Pythonic rendering engine. + +Pygfx provides a basis on top of which a multitude of visualizations become possible. From applications to libraries, from games to plotting. + + + + +## โค๏ธ Current sponsors + +Pygfx and wgpu are free. To develop these projects we rely on [funding from our sponsors](sponsor.html). The more groups "chip in", the more time we can spend on moving the projects forwards. Recurring funding is especially welcome. + +
+

Ramona optics

+
+
https://ramonaoptics.com +
+ +
+

The Flatiron institute

+
+ https://simonsfoundation.org/flatiron/ +
+ + + +## ๐Ÿ‘ฅ Team + +
+
+ @almarklein +
+ +
+
+ @korijn +
+ diff --git a/pages/sponsor.md b/pages/sponsor.md new file mode 100644 index 0000000..c4a9b2d --- /dev/null +++ b/pages/sponsor.md @@ -0,0 +1,47 @@ + + +# Sponsoring Pygfx + + +## ๐Ÿง‘โ€๐Ÿคโ€๐Ÿง‘ Keep pygfx independent and active + +Maintaining and growing wgpu and pygfx costs time and dedication. We rely on sponsors to maintain (and grow) the project further. +If you represent a company / group that relies on pygfx or wgpu-pu, we kindly ask for a sponsorship. That way we can keep replying to issues, review pull request, and move pygfx further. + + +## ๐ŸŽ What you get + +* Most importantly, sponsors help ensure that pygfx is actively maintained! +* Sponsors also get priority on bug reports and feature requests. +* An honorable mention on the front page of pygfx.org! +* In the top tiers, one-on-one support to help you use Pygfx to the max. + +We employ a few different [sponsorship tiers](https://github.com/sponsors/pygfx). + + +## ๐Ÿงพ Ways to sponsor Pygfx + +We provide a few ways to get funds to us. If you have questions, do not hesitate to reach out to [support@pygfx.com](mailto:support@pygfx.com)! + +### Directly + +You can sponsor us directly via *Almar Klein scientific computing*, based in The Netherlands. We can provide an invoice and you pay by bank transfer. +Incoming funds for Pygfx are received at a dedicated bank account, and insights into how the funds are spent will be published on a yearly basis. + + +### Via OpenCollective + +You can sponsor us via [https://opencollective.com/pygfx](https://opencollective.com/pygfx). These funds and how they are spent are publicly visible. + + +### Via Github + +You can also sponsor via Github's sponsor system: https://github.com/sponsors/pygfx + + +## ๐Ÿ’ฐ How funds are spent + +Sponsorship funds for Pygfx are primarily used to fund our developer time. +If we receive more funds than we can spend, the surplus acts as a buffer to create runway. If that buffer becomes large enough we plan to onboard additional developers. + + diff --git a/static/pygfx.png b/static/pygfx.png new file mode 100644 index 0000000000000000000000000000000000000000..409abc015bd6f50fa1d4c15dad5ef427b9ffb1c6 GIT binary patch literal 55421 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

fkF(#m(^^6Luz1JbQL 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 Tes0SZ8L(+1^fW5rc9H)FNQrAl literal 0 HcmV?d00001 diff --git a/style.css b/style.css new file mode 100644 index 0000000..e8d525c --- /dev/null +++ b/style.css @@ -0,0 +1,259 @@ +/*! normalize.css v8.0.0 | MIT License | github.com/necolas/normalize.css */ +html{line-height:1.15;-webkit-text-size-adjust:100%} +body{margin:0} +h1{font-size:2em;margin:.67em 0} +hr{box-sizing:content-box;height:0;overflow:visible} +pre{font-family:monospace,monospace;font-size:1em} +a{background-color:transparent} +abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted} +b,strong{font-weight:bolder} +code,kbd,samp{font-family:monospace,monospace;font-size:1em} +small{font-size:80%} +sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline} +sub{bottom:-.25em} +sup{top:-.5em} +img{border-style:none} +button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible} +button,select{text-transform:none} +button,[type="button"],[type="reset"],[type="submit"]{-webkit-appearance:button} +button::-moz-focus-inner,[type="button"]::-moz-focus-inner,[type="reset"]::-moz-focus-inner,[type="submit"]::-moz-focus-inner{border-style:none;padding:0} +button:-moz-focusring,[type="button"]:-moz-focusring,[type="reset"]:-moz-focusring,[type="submit"]:-moz-focusring{outline:1px dotted ButtonText} +fieldset{padding:.35em .75em .625em} +legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal} +progress{vertical-align:baseline} +textarea{overflow:auto} +[type="checkbox"],[type="radio"]{box-sizing:border-box;padding:0} +[type="number"]::-webkit-inner-spin-button,[type="number"]::-webkit-outer-spin-button{height:auto} +[type="search"]{-webkit-appearance:textfield;outline-offset:-2px} +[type="search"]::-webkit-search-decoration{-webkit-appearance:none} +::-webkit-file-upload-button{-webkit-appearance:button;font:inherit} +details{display:block} +summary{display:list-item} +template{display:none} +[hidden]{display:none} + +html { + height: 100%; +} + +body { + height: 100%; + font-family: Ubuntu,"Helvetica Neue",Arial,sans-serif; + color: #404040; + font-weight: normal; + background: #fcfcfc; +} +.content { + box-sizing: border-box; + padding: 1em 1em; + width: 100%; + + position: static; + max-width: none; + margin: 0; + margin-top: 1em; + + /* + background: #fcfcfc; + */ + border-radius: 6px; + box-shadow: 0 0 5px rgba(0, 0, 0, 0.2); +} +p, li { + line-height: 150%; +} +.menu { + box-sizing: border-box; + position: static; + width: 100%; + max-width: none; + + background: #f8f8f8; + padding: 0.5em 1em; + overflow: hidden; + white-space: nowrap; + + border-radius: 6px; + box-shadow: 0 0 5px rgba(0, 0, 0, 0.2); +} + +.projectbox, .sponsorbox, .profilebox { + box-sizing: border-box; + display: inline-block; + position: relative; /* so stuff can be abs-positined inside */ + width: 100%; + background: #f1f1f1; + padding: 1em 1em; + margin: 0.5em; + border-radius: 6px; +} +.profilebox { + text-align: center; +} +.projectbox h3, .sponsorbox h3 { + color:#444; + font-size: 110%; +} +.sponsorbox img { + margin-bottom: 8px; + height: 50px; +} + +img.stars-badge { + position: absolute; + display: block; + top: 7px; + right: 7px; +} + +img.profile { + width: 100px; + height: 100px; + border-radius: 50px; +} + +@media screen and (min-width: 500px) { + .projectbox { + width: 450px; + } + .sponsorbox { + width: 450px; + } + .profilebox { + width: 150px; + } +} +@media screen and (min-width: 1300px) { + .content { + width: 1000px; + padding: 1em 1.5em; + margin-left: auto; + margin-right: 370px; + } + .absspacer { + height: 100px; + } + .menu { + position: fixed; + top: 1em; + right: 10px; + max-width: 250px; + margin-top: 0; + } +} +@media screen and (min-width: 1650px) { + .content { + margin-right: auto; + } + .menu { + left: calc(50% + 500px + 20px); + max-width: 300px; + } +} + +a:link, a:visited, a:active { + color: #36C; + text-decoration: none; +} +a:hover { + text-decoration: underline; +} +.menu .header { + color: #aaa; + display: block; + border-bottom: 1px solid #ccc; +} +.menu a { + font-size: 120%; + color: #000; + line-height: 150%; + margin-left: 0.5em; +} +.menu a.current { + font-weight: bold; +} +.menu a.sub { + font-size: 90%; + /*margin-left: 1.5em;*/ +} + +.menu .ad { + box-sizing: border-box; + max-width: 270px; + white-space: normal; + text-align: center; +} +.menu .ad a { + font-size: 70%; + line-height: 100%; + margin: 0; +} +.menu .ad a.a-ad { + font-size: 95%; + text-decoration: none; +} + +a.anch:hover { + text-decoration: none; +} +a.anch:hover h2::after { + content: " \00B6"; + color: rgba(0, 0, 0, 0.3); + font-size: 80%; +} +hr { + height: 1px; + background: rgba(30, 60, 90, 0.2); + border: 0px solid #ccc; +} +.footer { + color: #888; + font-size: 80%; +} +code { + font-family: Consolas,"Andale Mono WT","Andale Mono","Lucida Console","Lucida Sans Typewriter","DejaVu Sans Mono","Bitstream Vera Sans Mono","Liberation Mono","Nimbus Mono L",Monaco,"Courier New",Courier,monospace; + font-size: 90%; + color: #000; + background: #fff; + padding: 1px 5px; + white-space: nowrap; + border: solid 1px #e1e4e5; +} +.highlight { /*pygments */ + font-family: dejavu sans mono,Consolas,"Andale Mono WT","Andale Mono","Lucida Console", "Courier New",Courier,monospace; + font-size: 12px; + color: #444; + background: #fff; + border: 1px solid #dddddd; + padding: 0em 1em; +} +h1, h2, h3, h4 { + color: #999; + font-family: Consolas, "DejaVu Sans Mono", Monaco, "Courier New", Courier, monospace; +} +a.header:hover { + color: #2A4; +} +h2 { + margin-top: 1.3em; + border-bottom: 1px solid rgba(20, 100, 40, 0.3); +} +h2 code, h3 code, h4 code { + color: #369; + padding-left: 0; + background: none; + border: 0px; + font-size: 85%; +} +span.post-date-tags { + float: right; + color: #888; + font-size: 80%; +} +img.thumb { + width: 128px; + height: 128px; + float: left; + margin: 0 1em 0.5em 0; + border-radius: 4px; +} diff --git a/template.html b/template.html new file mode 100644 index 0000000..51a3d4a --- /dev/null +++ b/template.html @@ -0,0 +1,36 @@ + + + + {title} + + + + + + + +

+ + + + {body} + +
+ +
+ + + +
+ +
+ + +