From 464bb0c725167df95f320854384f67971a1eaa5e Mon Sep 17 00:00:00 2001 From: Alejandro Piad Date: Sat, 14 Dec 2019 21:47:47 +0100 Subject: [PATCH 1/4] Add static html demo slide --- auditorium/__main__.py | 1 + auditorium/demo.py | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/auditorium/__main__.py b/auditorium/__main__.py index 4a8f89a..1786e01 100644 --- a/auditorium/__main__.py +++ b/auditorium/__main__.py @@ -18,6 +18,7 @@ def load(path, instance_name='show'): return show + class Auditorium: @staticmethod def run(path, host='localhost', port=6789, debug=False, instance_name='show', launch=True): diff --git a/auditorium/demo.py b/auditorium/demo.py index b3c21d2..41bc8cc 100644 --- a/auditorium/demo.py +++ b/auditorium/demo.py @@ -358,6 +358,24 @@ def pyplot_code(): """) +@show.slide +def static_html(): + """ + ## Going full static + + If you only need `auditorium` for the initial rendering of the HTML, + and have no animations or interactive code, you can use: + """ + + show.code('auditorium render [file] > [output.html]', 'bash') + + show.markdown(""" + This will render the slideshow into a static HTML with all CSS and + JavaScript embedded, that you can take away and reproduce in any browser, + or host on a static file server (like Github pages). + """) + + @show.slide def themes(): """ From 1166a1b67c8b75bd18d2848c7d0a85c52c9faa4d Mon Sep 17 00:00:00 2001 From: Alejandro Piad Date: Sat, 14 Dec 2019 21:59:43 +0100 Subject: [PATCH 2/4] Bump version --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 829c266..c8cf640 100644 --- a/setup.py +++ b/setup.py @@ -5,7 +5,7 @@ # TODO: Update version whenever changes -VERSION = '0.5.0' +VERSION = '0.5.1' def get_install_requirements(): From 965cabf6804c09be1d6616e5f29da647bd7c4802 Mon Sep 17 00:00:00 2001 From: Alejandro Piad Date: Sat, 14 Dec 2019 23:47:54 +0100 Subject: [PATCH 3/4] Add pygments --- Pipfile | 1 + Pipfile.lock | 127 ++++++++++++++------------ README.md | 4 + auditorium/show.py | 30 +++++- auditorium/static/css/auditorium.css | 4 + auditorium/static/lib/css/monokai.css | 71 -------------- auditorium/static/lib/css/zenburn.css | 80 ---------------- auditorium/templates/dynamic.html | 5 +- auditorium/templates/static.html | 6 +- 9 files changed, 105 insertions(+), 223 deletions(-) delete mode 100644 auditorium/static/lib/css/monokai.css delete mode 100644 auditorium/static/lib/css/zenburn.css diff --git a/Pipfile b/Pipfile index 062e2b1..6429442 100644 --- a/Pipfile +++ b/Pipfile @@ -16,6 +16,7 @@ markdown = "*" fire = "*" sanic = "*" jinja2 = "*" +pygments = "*" [requires] python_version = "3.6" diff --git a/Pipfile.lock b/Pipfile.lock index 4ad07ec..dc1d92b 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "5e49a5bbc8d302d0bf74cb846f92bd08b16f35559680527da920c9d7dbd7ec6c" + "sha256": "272203b89b1b3539487de14c646051cf86ed0bdf5a14b2b53d64f3efe83b26d7" }, "pipfile-spec": 6, "requires": { @@ -142,25 +142,33 @@ }, "multidict": { "hashes": [ - "sha256:07f9a6bf75ad675d53956b2c6a2d4ef2fa63132f33ecc99e9c24cf93beb0d10b", - "sha256:0ffe4d4d28cbe9801952bfb52a8095dd9ffecebd93f84bdf973c76300de783c5", - "sha256:1b605272c558e4c659dbaf0fb32a53bfede44121bcf77b356e6e906867b958b7", - "sha256:205a011e636d885af6dd0029e41e3514a46e05bb2a43251a619a6e8348b96fc0", - "sha256:250632316295f2311e1ed43e6b26a63b0216b866b45c11441886ac1543ca96e1", - "sha256:2bc9c2579312c68a3552ee816311c8da76412e6f6a9cf33b15152e385a572d2a", - "sha256:318aadf1cfb6741c555c7dd83d94f746dc95989f4f106b25b8a83dfb547f2756", - "sha256:42cdd649741a14b0602bf15985cad0dd4696a380081a3319cd1ead46fd0f0fab", - "sha256:5159c4975931a1a78bf6602bbebaa366747fce0a56cb2111f44789d2c45e379f", - "sha256:87e26d8b89127c25659e962c61a4c655ec7445d19150daea0759516884ecb8b4", - "sha256:891b7e142885e17a894d9d22b0349b92bb2da4769b4e675665d0331c08719be5", - "sha256:8d919034420378132d074bf89df148d0193e9780c9fe7c0e495e895b8af4d8a2", - "sha256:9c890978e2b37dd0dc1bd952da9a5d9f245d4807bee33e3517e4119c48d66f8c", - "sha256:a37433ce8cdb35fc9e6e47e1606fa1bfd6d70440879038dca7d8dd023197eaa9", - "sha256:c626029841ada34c030b94a00c573a0c7575fe66489cde148785b6535397d675", - "sha256:cfec9d001a83dc73580143f3c77e898cf7ad78b27bb5e64dbe9652668fcafec7", - "sha256:efaf1b18ea6c1f577b1371c0159edbe4749558bfe983e13aa24d0a0c01e1ad7b" - ], - "version": "==4.6.1" + "sha256:09c19f642e055550c9319d5123221b7e07fc79bda58122aa93910e52f2ab2f29", + "sha256:0c1a5d5f7aa7189f7b83c4411c2af8f1d38d69c4360d5de3eea129c65d8d7ce2", + "sha256:12f22980e7ed0972a969520fb1e55682c9fca89a68b21b49ec43132e680be812", + "sha256:258660e9d6b52de1a75097944e12718d3aa59adc611b703361e3577d69167aaf", + "sha256:3374a23e707848f27b3438500db0c69eca82929337656fce556bd70031fbda74", + "sha256:503b7fce0054c73aa631cc910a470052df33d599f3401f3b77e54d31182525d5", + "sha256:6ce55f2c45ffc90239aab625bb1b4864eef33f73ea88487ef968291fbf09fb3f", + "sha256:725496dde5730f4ad0a627e1a58e2620c1bde0ad1c8080aae15d583eb23344ce", + "sha256:a3721078beff247d0cd4fb19d915c2c25f90907cf8d6cd49d0413a24915577c6", + "sha256:ba566518550f81daca649eded8b5c7dd09210a854637c82351410aa15c49324a", + "sha256:c42362750a51a15dc905cb891658f822ee5021bfbea898c03aa1ed833e2248a5", + "sha256:cf14aaf2ab067ca10bca0b14d5cbd751dd249e65d371734bc0e47ddd8fafc175", + "sha256:cf24e15986762f0e75a622eb19cfe39a042e952b8afba3e7408835b9af2be4fb", + "sha256:d7b6da08538302c5245cd3103f333655ba7f274915f1f5121c4f4b5fbdb3febe", + "sha256:e27e13b9ff0a914a6b8fb7e4947d4ac6be8e4f61ede17edffabd088817df9e26", + "sha256:e53b205f8afd76fc6c942ef39e8ee7c519c775d336291d32874082a87802c67c", + "sha256:ec804fc5f68695d91c24d716020278fcffd50890492690a7e1fef2e741f7172c" + ], + "version": "==4.7.1" + }, + "pygments": { + "hashes": [ + "sha256:2a3fe295e54a20164a9df49c75fa58526d3be48e14aceba6d6b1e8ac0bfd6f1b", + "sha256:98c8aa5a9f778fcd1026a17361ddaf7330d1b7c62ae97c3bb0ae73e0b9b6b0fe" + ], + "index": "pypi", + "version": "==2.5.2" }, "requests": { "hashes": [ @@ -307,40 +315,39 @@ }, "coverage": { "hashes": [ - "sha256:08907593569fe59baca0bf152c43f3863201efb6113ecb38ce7e97ce339805a6", - "sha256:0be0f1ed45fc0c185cfd4ecc19a1d6532d72f86a2bac9de7e24541febad72650", - "sha256:141f08ed3c4b1847015e2cd62ec06d35e67a3ac185c26f7635f4406b90afa9c5", - "sha256:19e4df788a0581238e9390c85a7a09af39c7b539b29f25c89209e6c3e371270d", - "sha256:23cc09ed395b03424d1ae30dcc292615c1372bfba7141eb85e11e50efaa6b351", - "sha256:245388cda02af78276b479f299bbf3783ef0a6a6273037d7c60dc73b8d8d7755", - "sha256:331cb5115673a20fb131dadd22f5bcaf7677ef758741312bee4937d71a14b2ef", - "sha256:386e2e4090f0bc5df274e720105c342263423e77ee8826002dcffe0c9533dbca", - "sha256:3a794ce50daee01c74a494919d5ebdc23d58873747fa0e288318728533a3e1ca", - "sha256:60851187677b24c6085248f0a0b9b98d49cba7ecc7ec60ba6b9d2e5574ac1ee9", - "sha256:63a9a5fc43b58735f65ed63d2cf43508f462dc49857da70b8980ad78d41d52fc", - "sha256:6b62544bb68106e3f00b21c8930e83e584fdca005d4fffd29bb39fb3ffa03cb5", - "sha256:6ba744056423ef8d450cf627289166da65903885272055fb4b5e113137cfa14f", - "sha256:7494b0b0274c5072bddbfd5b4a6c6f18fbbe1ab1d22a41e99cd2d00c8f96ecfe", - "sha256:826f32b9547c8091679ff292a82aca9c7b9650f9fda3e2ca6bf2ac905b7ce888", - "sha256:93715dffbcd0678057f947f496484e906bf9509f5c1c38fc9ba3922893cda5f5", - "sha256:9a334d6c83dfeadae576b4d633a71620d40d1c379129d587faa42ee3e2a85cce", - "sha256:af7ed8a8aa6957aac47b4268631fa1df984643f07ef00acd374e456364b373f5", - "sha256:bf0a7aed7f5521c7ca67febd57db473af4762b9622254291fbcbb8cd0ba5e33e", - "sha256:bf1ef9eb901113a9805287e090452c05547578eaab1b62e4ad456fcc049a9b7e", - "sha256:c0afd27bc0e307a1ffc04ca5ec010a290e49e3afbe841c5cafc5c5a80ecd81c9", - "sha256:dd579709a87092c6dbee09d1b7cfa81831040705ffa12a1b248935274aee0437", - "sha256:df6712284b2e44a065097846488f66840445eb987eb81b3cc6e4149e7b6982e1", - "sha256:e07d9f1a23e9e93ab5c62902833bf3e4b1f65502927379148b6622686223125c", - "sha256:e2ede7c1d45e65e209d6093b762e98e8318ddeff95317d07a27a2140b80cfd24", - "sha256:e4ef9c164eb55123c62411f5936b5c2e521b12356037b6e1c2617cef45523d47", - "sha256:eca2b7343524e7ba246cab8ff00cab47a2d6d54ada3b02772e908a45675722e2", - "sha256:eee64c616adeff7db37cc37da4180a3a5b6177f5c46b187894e633f088fb5b28", - "sha256:ef824cad1f980d27f26166f86856efe11eff9912c4fed97d3804820d43fa550c", - "sha256:efc89291bd5a08855829a3c522df16d856455297cf35ae827a37edac45f466a7", - "sha256:fa964bae817babece5aa2e8c1af841bebb6d0b9add8e637548809d040443fee0", - "sha256:ff37757e068ae606659c28c3bd0d923f9d29a85de79bf25b2b34b148473b5025" - ], - "version": "==4.5.4" + "sha256:0cd13a6e98c37b510a2d34c8281d5e1a226aaf9b65b7d770ef03c63169965351", + "sha256:1a4b6b6a2a3a6612e6361130c2cc3dc4378d8c221752b96167ccbad94b47f3cd", + "sha256:2ee55e6dba516ddf6f484aa83ccabbb0adf45a18892204c23486938d12258cde", + "sha256:3be5338a2eb4ef03c57f20917e1d12a1fd10e3853fed060b6d6b677cb3745898", + "sha256:44b783b02db03c4777d8cf71bae19eadc171a6f2a96777d916b2c30a1eb3d070", + "sha256:475bf7c4252af0a56e1abba9606f1e54127cdf122063095c75ab04f6f99cf45e", + "sha256:47c81ee687eafc2f1db7f03fbe99aab81330565ebc62fb3b61edfc2216a550c8", + "sha256:4a7f8e72b18f2aca288ff02255ce32cc830bc04d993efbc87abf6beddc9e56c0", + "sha256:50197163a22fd17f79086e087a787883b3ec9280a509807daf158dfc2a7ded02", + "sha256:56b13000acf891f700f5067512b804d1ec8c301d627486c678b903859d07f798", + "sha256:79388ae29c896299b3567965dbcd93255f175c17c6c7bca38614d12718c47466", + "sha256:79fd5d3d62238c4f583b75d48d53cdae759fe04d4fb18fe8b371d88ad2b6f8be", + "sha256:7fe3e2fde2bf1d7ce25ebcd2d3de3650b8d60d9a73ce6dcef36e20191291613d", + "sha256:81042a24f67b96e4287774014fa27220d8a4d91af1043389e4d73892efc89ac6", + "sha256:81326f1095c53111f8afc95da281e1414185f4a538609a77ca50bdfa39a6c207", + "sha256:8873dc0d8f42142ea9f20c27bbdc485190fff93823c6795be661703369e5877d", + "sha256:88d2cbcb0a112f47eef71eb95460b6995da18e6f8ca50c264585abc2c473154b", + "sha256:91f2491aeab9599956c45a77c5666d323efdec790bfe23fcceafcd91105d585a", + "sha256:979daa8655ae5a51e8e7a24e7d34e250ae8309fd9719490df92cbb2fe2b0422b", + "sha256:9c871b006c878a890c6e44a5b2f3c6291335324b298c904dc0402ee92ee1f0be", + "sha256:a6d092545e5af53e960465f652e00efbf5357adad177b2630d63978d85e46a72", + "sha256:b5ed7837b923d1d71c4f587ae1539ccd96bfd6be9788f507dbe94dab5febbb5d", + "sha256:ba259f68250f16d2444cbbfaddaa0bb20e1560a4fdaad50bece25c199e6af864", + "sha256:be1d89614c6b6c36d7578496dc8625123bda2ff44f224cf8b1c45b810ee7383f", + "sha256:c1b030a79749aa8d1f1486885040114ee56933b15ccfc90049ba266e4aa2139f", + "sha256:c95bb147fab76f2ecde332d972d8f4138b8f2daee6c466af4ff3b4f29bd4c19e", + "sha256:d52c1c2d7e856cecc05aa0526453cb14574f821b7f413cc279b9514750d795c1", + "sha256:d609a6d564ad3d327e9509846c2c47f170456344521462b469e5cb39e48ba31c", + "sha256:e1bad043c12fb58e8c7d92b3d7f2f49977dcb80a08a6d1e7a5114a11bf819fca", + "sha256:e5a675f6829c53c87d79117a8eb656cc4a5f8918185a32fc93ba09778e90f6db", + "sha256:fec32646b98baf4a22fdceb08703965bd16dea09051fbeb31a04b5b6e72b846c" + ], + "version": "==5.0" }, "cycler": { "hashes": [ @@ -358,11 +365,11 @@ }, "importlib-metadata": { "hashes": [ - "sha256:3a8b2dfd0a2c6a3636e7c016a7e54ae04b997d30e69d5eacdca7a6c2221a1402", - "sha256:41e688146d000891f32b1669e8573c57e39e5060e7f5f647aa617cd9a9568278" + "sha256:073a852570f92da5f744a3472af1b61e28e9f78ccf0c9117658dc32b15de7b45", + "sha256:d95141fbfa7ef2ec65cfd945e2af7e5a6ddbd7c8d9a25e66ff3be8e3daf9f60f" ], "markers": "python_version < '3.8'", - "version": "==1.2.0" + "version": "==1.3.0" }, "isort": { "hashes": [ @@ -536,11 +543,11 @@ }, "pytest": { "hashes": [ - "sha256:63344a2e3bce2e4d522fd62b4fdebb647c019f1f9e4ca075debbd13219db4418", - "sha256:f67403f33b2b1d25a6756184077394167fe5e2f9d8bdaab30707d19ccec35427" + "sha256:6b571215b5a790f9b41f19f3531c53a45cf6bb8ef2988bc1ff9afb38270b25fa", + "sha256:e41d489ff43948babd0fad7ad5e49b8735d5d55e26628a58673c39ff61d95de4" ], "index": "pypi", - "version": "==5.3.1" + "version": "==5.3.2" }, "pytest-cov": { "hashes": [ diff --git a/README.md b/README.md index 7196f63..3995d5a 100644 --- a/README.md +++ b/README.md @@ -240,6 +240,10 @@ Staying away from `eval` and `exec` should keep you safe in most scenarios, but ## History +### v0.5.1 + +* Added `pygments` for code highlighting, removing `highlight.js` and fixing the error with static rendering. + ### v0.5.0 * Added command `auditorium render` to generate a static HTML that can be displayed without `auditorium`. diff --git a/auditorium/show.py b/auditorium/show.py index a29c969..d288a65 100644 --- a/auditorium/show.py +++ b/auditorium/show.py @@ -15,6 +15,10 @@ from sanic import Sanic from sanic.response import html, json +from pygments import highlight +from pygments.lexers import get_lexer_by_name +from pygments.formatters.html import HtmlFormatter +from pygments.styles import get_style_by_name from .components import ShowMode, Animation, Column, Vertical, Fragment, Block from .utils import fix_indent @@ -25,7 +29,7 @@ def path(p): class Show: - def __init__(self, title="", theme='white'): + def __init__(self, title="", theme='white', code_style='monokai'): self.slides = {} self.slide_ids = [] self.vertical_slides = {} @@ -43,6 +47,7 @@ def __init__(self, title="", theme='white'): self._unique_id = 0 self._global_values = {} self._mode = ShowMode.Edit + self._formatter = HtmlFormatter(style=get_style_by_name(code_style)) with open(path('templates/content.html')) as fp: self._template_content = Template(fp.read()) @@ -175,8 +180,11 @@ def code(self, text, language='python'): _, id_markup = self._get_unique_id("code") content = fix_indent(text) + lexer = get_lexer_by_name(language) + code = highlight(content, lexer, self._formatter) + if self._mode == ShowMode.Markup: - self.current_content.append(f'
{content}
') + self.current_content.append(f'
{code}
') # else: # self.current_update[item_id] = markdown(content) @@ -250,8 +258,17 @@ def _embed(self, src): with open(path(src)) as fp: return fp.read() + def _code_style(self): + return self._formatter.get_style_defs('.highlight') + def render(self, theme=None): - return self._template_static.render(show=self, content=self._render_content(), embed=self._embed, theme=theme or self.theme) + return self._template_static.render( + show=self, + content=self._render_content(), + code_style=self._code_style(), + embed=self._embed, + theme=theme or self.theme + ) ## Routes @@ -268,4 +285,9 @@ async def _update(self, request): async def _index(self, request): theme = request.args.get("theme", self.theme) - return html(self._template_dynamic.render(show=self, content=self._content, theme=theme)) + return html(self._template_dynamic.render( + show=self, + content=self._content, + code_style=self._code_style(), + theme=theme + )) diff --git a/auditorium/static/css/auditorium.css b/auditorium/static/css/auditorium.css index 8490dd3..161763d 100644 --- a/auditorium/static/css/auditorium.css +++ b/auditorium/static/css/auditorium.css @@ -8,6 +8,10 @@ text-align: center; } +.reveal section pre { + width: 98%; +} + .reveal section input.text:focus { border: 0px; border-bottom: 1px solid navy; diff --git a/auditorium/static/lib/css/monokai.css b/auditorium/static/lib/css/monokai.css deleted file mode 100644 index af24834..0000000 --- a/auditorium/static/lib/css/monokai.css +++ /dev/null @@ -1,71 +0,0 @@ -/* -Monokai style - ported by Luigi Maselli - http://grigio.org -*/ - -.hljs { - display: block; - overflow-x: auto; - padding: 0.5em; - background: #272822; - color: #ddd; -} - -.hljs-tag, -.hljs-keyword, -.hljs-selector-tag, -.hljs-literal, -.hljs-strong, -.hljs-name { - color: #f92672; -} - -.hljs-code { - color: #66d9ef; -} - -.hljs-class .hljs-title { - color: white; -} - -.hljs-attribute, -.hljs-symbol, -.hljs-regexp, -.hljs-link { - color: #bf79db; -} - -.hljs-string, -.hljs-bullet, -.hljs-subst, -.hljs-title, -.hljs-section, -.hljs-emphasis, -.hljs-type, -.hljs-built_in, -.hljs-builtin-name, -.hljs-selector-attr, -.hljs-selector-pseudo, -.hljs-addition, -.hljs-variable, -.hljs-template-tag, -.hljs-template-variable { - color: #a6e22e; -} - -.hljs-comment, -.hljs-quote, -.hljs-deletion, -.hljs-meta { - color: #75715e; -} - -.hljs-keyword, -.hljs-selector-tag, -.hljs-literal, -.hljs-doctag, -.hljs-title, -.hljs-section, -.hljs-type, -.hljs-selector-id { - font-weight: bold; -} diff --git a/auditorium/static/lib/css/zenburn.css b/auditorium/static/lib/css/zenburn.css deleted file mode 100644 index 07be502..0000000 --- a/auditorium/static/lib/css/zenburn.css +++ /dev/null @@ -1,80 +0,0 @@ -/* - -Zenburn style from voldmar.ru (c) Vladimir Epifanov -based on dark.css by Ivan Sagalaev - -*/ - -.hljs { - display: block; - overflow-x: auto; - padding: 0.5em; - background: #3f3f3f; - color: #dcdcdc; -} - -.hljs-keyword, -.hljs-selector-tag, -.hljs-tag { - color: #e3ceab; -} - -.hljs-template-tag { - color: #dcdcdc; -} - -.hljs-number { - color: #8cd0d3; -} - -.hljs-variable, -.hljs-template-variable, -.hljs-attribute { - color: #efdcbc; -} - -.hljs-literal { - color: #efefaf; -} - -.hljs-subst { - color: #8f8f8f; -} - -.hljs-title, -.hljs-name, -.hljs-selector-id, -.hljs-selector-class, -.hljs-section, -.hljs-type { - color: #efef8f; -} - -.hljs-symbol, -.hljs-bullet, -.hljs-link { - color: #dca3a3; -} - -.hljs-deletion, -.hljs-string, -.hljs-built_in, -.hljs-builtin-name { - color: #cc9393; -} - -.hljs-addition, -.hljs-comment, -.hljs-quote, -.hljs-meta { - color: #7f9f7f; -} - - -.hljs-emphasis { - font-style: italic; -} - -.hljs-strong { - font-weight: bold; -} diff --git a/auditorium/templates/dynamic.html b/auditorium/templates/dynamic.html index ab2827b..cc09153 100644 --- a/auditorium/templates/dynamic.html +++ b/auditorium/templates/dynamic.html @@ -12,8 +12,7 @@ - - + - - - From 1942ae54fc9381d71f8c61bbaf96774263d6f1fe Mon Sep 17 00:00:00 2001 From: Alejandro Piad Date: Sat, 14 Dec 2019 23:53:44 +0100 Subject: [PATCH 4/4] Update demo --- auditorium/static/md/demo.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/auditorium/static/md/demo.md b/auditorium/static/md/demo.md index edb869a..c56bbab 100644 --- a/auditorium/static/md/demo.md +++ b/auditorium/static/md/demo.md @@ -65,7 +65,7 @@ cl.end()
-~~~markdown +~~~md ```python :run :persist text = show.text_input("World") ```