jupypress 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- jupypress-0.1.0/.eslintrc.json +28 -0
- jupypress-0.1.0/.gitignore +90 -0
- jupypress-0.1.0/.prettierrc +10 -0
- jupypress-0.1.0/.yarnrc.yml +1 -0
- jupypress-0.1.0/CHANGELOG.md +12 -0
- jupypress-0.1.0/CODE_OF_CONDUCT.md +23 -0
- jupypress-0.1.0/CONTRIBUTING.md +126 -0
- jupypress-0.1.0/LICENSE +28 -0
- jupypress-0.1.0/MANIFEST.in +10 -0
- jupypress-0.1.0/PKG-INFO +178 -0
- jupypress-0.1.0/README.md +105 -0
- jupypress-0.1.0/SECURITY.md +19 -0
- jupypress-0.1.0/docs/AGENTS.md +298 -0
- jupypress-0.1.0/docs/BACKEND_STRUCTURE.md +495 -0
- jupypress-0.1.0/docs/DEVELOPMENT.md +191 -0
- jupypress-0.1.0/docs/FRONTEND_STRUCTURE.md +314 -0
- jupypress-0.1.0/docs/RELEASE.md +52 -0
- jupypress-0.1.0/docs/TEST.md +82 -0
- jupypress-0.1.0/docs/images/README.md +8 -0
- jupypress-0.1.0/docs/images/editor.png +0 -0
- jupypress-0.1.0/docs/images/export-html.png +0 -0
- jupypress-0.1.0/docs/images/launch.png +0 -0
- jupypress-0.1.0/docs/images/present-livecode.png +0 -0
- jupypress-0.1.0/docs/theming.md +89 -0
- jupypress-0.1.0/install.json +5 -0
- jupypress-0.1.0/jest.config.js +46 -0
- jupypress-0.1.0/jupypress/__init__.py +19 -0
- jupypress-0.1.0/jupypress/_version.py +5 -0
- jupypress-0.1.0/jupypress/cell_renderer.py +164 -0
- jupypress-0.1.0/jupypress/exporter.py +220 -0
- jupypress-0.1.0/jupypress/extension.py +16 -0
- jupypress-0.1.0/jupypress/handlers.py +208 -0
- jupypress-0.1.0/jupypress/metadata_utils.py +55 -0
- jupypress-0.1.0/jupypress/slide_builder.py +104 -0
- jupypress-0.1.0/jupypress/templates/.gitkeep +1 -0
- jupypress-0.1.0/jupypress/templates/deck.html.j2 +119 -0
- jupypress-0.1.0/jupypress/templates/static/css/base.css +693 -0
- jupypress-0.1.0/jupypress/templates/static/js/navigation.js +524 -0
- jupypress-0.1.0/jupypress/templates/themes/default/theme.css +388 -0
- jupypress-0.1.0/jupypress/templates/themes/jupyterlab/theme.css +139 -0
- jupypress-0.1.0/jupyter-config/jupyter_server_config.d/jupypress.json +7 -0
- jupypress-0.1.0/package.json +90 -0
- jupypress-0.1.0/pyproject.toml +141 -0
- jupypress-0.1.0/schema/plugin.json +23 -0
- jupypress-0.1.0/src/commands.ts +228 -0
- jupypress-0.1.0/src/components/CellAssigner.tsx +154 -0
- jupypress-0.1.0/src/components/CellPickerModal.tsx +237 -0
- jupypress-0.1.0/src/components/DocsModal.tsx +93 -0
- jupypress-0.1.0/src/components/JupyterLabPresentation.tsx +1595 -0
- jupypress-0.1.0/src/components/LayoutSelector.tsx +144 -0
- jupypress-0.1.0/src/components/SlideEditorPanel.tsx +381 -0
- jupypress-0.1.0/src/components/SlideItem.tsx +164 -0
- jupypress-0.1.0/src/components/SlideList.tsx +217 -0
- jupypress-0.1.0/src/components/ThemeEditor.tsx +283 -0
- jupypress-0.1.0/src/components/icons/Icons.tsx +82 -0
- jupypress-0.1.0/src/components/index.ts +11 -0
- jupypress-0.1.0/src/hooks/useNotebookModel.ts +160 -0
- jupypress-0.1.0/src/index.ts +66 -0
- jupypress-0.1.0/src/service.ts +111 -0
- jupypress-0.1.0/src/tokens.ts +50 -0
- jupypress-0.1.0/src/toolbar.ts +24 -0
- jupypress-0.1.0/src/utils/css/base.css.ts +701 -0
- jupypress-0.1.0/src/utils/css/theme.css.ts +389 -0
- jupypress-0.1.0/src/utils/htmlBuilder.ts +480 -0
- jupypress-0.1.0/src/utils/js/navigation.js.ts +535 -0
- jupypress-0.1.0/src/utils/kernelExecutor.ts +181 -0
- jupypress-0.1.0/src/utils/metadata.ts +77 -0
- jupypress-0.1.0/src/utils/outputRenderer.ts +119 -0
- jupypress-0.1.0/src/utils/slideMapper.ts +73 -0
- jupypress-0.1.0/style/index.css +2060 -0
- jupypress-0.1.0/tests/js/htmlBuilder.test.ts +285 -0
- jupypress-0.1.0/tests/js/kernelExecutor.test.ts +105 -0
- jupypress-0.1.0/tests/js/metadata.test.ts +91 -0
- jupypress-0.1.0/tests/js/outputRenderer.test.ts +56 -0
- jupypress-0.1.0/tests/js/slideMapper.test.ts +87 -0
- jupypress-0.1.0/tests/python/conftest.py +81 -0
- jupypress-0.1.0/tests/python/notebooks/sample.ipynb +57 -0
- jupypress-0.1.0/tests/python/test_cell_renderer.py +72 -0
- jupypress-0.1.0/tests/python/test_exporter.py +51 -0
- jupypress-0.1.0/tests/python/test_handlers.py +28 -0
- jupypress-0.1.0/tests/python/test_slide_builder.py +53 -0
- jupypress-0.1.0/tsconfig.json +29 -0
- jupypress-0.1.0/yarn.lock +8771 -0
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"parser": "@typescript-eslint/parser",
|
|
3
|
+
"parserOptions": {
|
|
4
|
+
"ecmaVersion": 2020,
|
|
5
|
+
"sourceType": "module",
|
|
6
|
+
"ecmaFeatures": {
|
|
7
|
+
"jsx": true
|
|
8
|
+
}
|
|
9
|
+
},
|
|
10
|
+
"extends": [
|
|
11
|
+
"eslint:recommended",
|
|
12
|
+
"plugin:@typescript-eslint/recommended"
|
|
13
|
+
],
|
|
14
|
+
"rules": {
|
|
15
|
+
"no-unused-vars": "off",
|
|
16
|
+
"no-useless-escape": "off",
|
|
17
|
+
"no-control-regex": "off",
|
|
18
|
+
"@typescript-eslint/no-namespace": "off",
|
|
19
|
+
"@typescript-eslint/no-unused-vars": [
|
|
20
|
+
"error",
|
|
21
|
+
{
|
|
22
|
+
"argsIgnorePattern": "^_"
|
|
23
|
+
}
|
|
24
|
+
],
|
|
25
|
+
"@typescript-eslint/explicit-module-boundary-types": "off",
|
|
26
|
+
"@typescript-eslint/no-explicit-any": "warn"
|
|
27
|
+
}
|
|
28
|
+
}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# .gitignore for jupypress
|
|
2
|
+
|
|
3
|
+
# Python
|
|
4
|
+
__pycache__/
|
|
5
|
+
*.py[cod]
|
|
6
|
+
*$py.class
|
|
7
|
+
*.so
|
|
8
|
+
.Python
|
|
9
|
+
build/
|
|
10
|
+
develop-eggs/
|
|
11
|
+
dist/
|
|
12
|
+
downloads/
|
|
13
|
+
eggs/
|
|
14
|
+
.eggs/
|
|
15
|
+
lib64/
|
|
16
|
+
parts/
|
|
17
|
+
sdist/
|
|
18
|
+
var/
|
|
19
|
+
wheels/
|
|
20
|
+
*.egg-info/
|
|
21
|
+
.installed.cfg
|
|
22
|
+
*.egg
|
|
23
|
+
pip-wheel-metadata/
|
|
24
|
+
__pypackages__/
|
|
25
|
+
|
|
26
|
+
# Virtual environments
|
|
27
|
+
venv/
|
|
28
|
+
ENV/
|
|
29
|
+
env/
|
|
30
|
+
.venv/
|
|
31
|
+
|
|
32
|
+
# IDEs
|
|
33
|
+
.vscode/
|
|
34
|
+
.idea/
|
|
35
|
+
*.swp
|
|
36
|
+
*.swo
|
|
37
|
+
*~
|
|
38
|
+
|
|
39
|
+
# Jupyter
|
|
40
|
+
.ipynb_checkpoints/
|
|
41
|
+
|
|
42
|
+
# Node/JS
|
|
43
|
+
node_modules/
|
|
44
|
+
.yarn/
|
|
45
|
+
*.tsbuildinfo
|
|
46
|
+
*.d.ts
|
|
47
|
+
npm-debug.log*
|
|
48
|
+
yarn-debug.log*
|
|
49
|
+
yarn-error.log*
|
|
50
|
+
.pnp/
|
|
51
|
+
.pnp.js
|
|
52
|
+
.package-lock.json # because we use jlpm (yarn instead of npm)
|
|
53
|
+
|
|
54
|
+
# TypeScript build output
|
|
55
|
+
lib/
|
|
56
|
+
|
|
57
|
+
# Hatch
|
|
58
|
+
.hatch/
|
|
59
|
+
|
|
60
|
+
# pytest
|
|
61
|
+
.pytest_cache/
|
|
62
|
+
.ruff_cache/
|
|
63
|
+
htmlcov/
|
|
64
|
+
.coverage
|
|
65
|
+
|
|
66
|
+
# Jest coverage
|
|
67
|
+
coverage/
|
|
68
|
+
|
|
69
|
+
# OS
|
|
70
|
+
.DS_Store
|
|
71
|
+
.env
|
|
72
|
+
.env.*
|
|
73
|
+
.cache/
|
|
74
|
+
|
|
75
|
+
# Local tools (act binary)
|
|
76
|
+
bin/
|
|
77
|
+
|
|
78
|
+
# Local AI/agent tooling state
|
|
79
|
+
.agents/
|
|
80
|
+
.codex/
|
|
81
|
+
.playwright-mcp/
|
|
82
|
+
|
|
83
|
+
# Prompts (local dev only)
|
|
84
|
+
.github/prompts/
|
|
85
|
+
|
|
86
|
+
# Compiled labextensions and static assets
|
|
87
|
+
jupypress/labextension/
|
|
88
|
+
|
|
89
|
+
# Reference
|
|
90
|
+
reference/
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
nodeLinker: node-modules
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to JupyPress will be documented in this file.
|
|
4
|
+
|
|
5
|
+
This project follows semantic versioning once public releases begin.
|
|
6
|
+
|
|
7
|
+
## 0.1.0 - Initial Release
|
|
8
|
+
|
|
9
|
+
- Add JupyterLab extension for building slide decks from notebook metadata.
|
|
10
|
+
- Add JupyterLab-backed preview and present modes using notebook output areas.
|
|
11
|
+
- Add standalone HTML export for static, shareable presentations.
|
|
12
|
+
- Add slide layouts, theming, keyboard navigation, and live code execution support.
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# Code of Conduct
|
|
2
|
+
|
|
3
|
+
JupyPress contributors are expected to keep project discussions professional, constructive, and focused on improving the software.
|
|
4
|
+
|
|
5
|
+
## Expected Behavior
|
|
6
|
+
|
|
7
|
+
- Be respectful of different experience levels and use cases.
|
|
8
|
+
- Provide actionable feedback.
|
|
9
|
+
- Keep issues and pull requests focused on the technical topic.
|
|
10
|
+
- Assume good intent while still being clear about defects, risks, and tradeoffs.
|
|
11
|
+
|
|
12
|
+
## Unacceptable Behavior
|
|
13
|
+
|
|
14
|
+
- Harassment, intimidation, or personal attacks.
|
|
15
|
+
- Dismissive or discriminatory language.
|
|
16
|
+
- Publishing private information without permission.
|
|
17
|
+
- Repeated off-topic or disruptive comments.
|
|
18
|
+
|
|
19
|
+
## Enforcement
|
|
20
|
+
|
|
21
|
+
Maintainers may edit, hide, or remove comments; close issues; reject contributions; or block participants when needed to keep the project usable for contributors and users.
|
|
22
|
+
|
|
23
|
+
Report conduct concerns through GitHub issue moderation tools or directly to the maintainers if contact information is available.
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
# Contributing to JupyPress
|
|
2
|
+
|
|
3
|
+
We welcome contributions! Here's how to get started.
|
|
4
|
+
|
|
5
|
+
## Code of Conduct
|
|
6
|
+
|
|
7
|
+
Be respectful and inclusive. We're building a welcoming community.
|
|
8
|
+
|
|
9
|
+
## Getting Started
|
|
10
|
+
|
|
11
|
+
1. Fork the repository
|
|
12
|
+
2. Clone your fork
|
|
13
|
+
3. Follow [DEVELOPMENT.md](docs/DEVELOPMENT.md) for setup
|
|
14
|
+
4. Create a feature branch: `git checkout -b feature/my-feature`
|
|
15
|
+
|
|
16
|
+
## Development Workflow
|
|
17
|
+
|
|
18
|
+
See [DEVELOPMENT.md](docs/DEVELOPMENT.md) for the full setup and dev-cycle instructions.
|
|
19
|
+
|
|
20
|
+
### Making Changes
|
|
21
|
+
|
|
22
|
+
1. Write code following the style guide
|
|
23
|
+
2. Write tests for new features
|
|
24
|
+
3. Rebuild and reinstall: `python -m build && pip install --force-reinstall ./dist/jupypress-0.1.0-py3-none-any.whl`
|
|
25
|
+
4. Ensure all tests pass: `hatch run test && jlpm run test`
|
|
26
|
+
5. Format code: `jlpm run format`
|
|
27
|
+
6. Lint: `jlpm run lint` and `hatch run lint`
|
|
28
|
+
|
|
29
|
+
### Testing
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
# Python tests
|
|
33
|
+
hatch run test
|
|
34
|
+
|
|
35
|
+
# JavaScript tests
|
|
36
|
+
jlpm run test
|
|
37
|
+
|
|
38
|
+
# Watch mode (JS)
|
|
39
|
+
jlpm run test:watch
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### Code Style
|
|
43
|
+
|
|
44
|
+
- **Python**: PEP 8, enforced by `ruff`
|
|
45
|
+
- **TypeScript**: ESLint + Prettier
|
|
46
|
+
- **React**: Functional components with hooks
|
|
47
|
+
- **CSS**: CSS variables for theming
|
|
48
|
+
|
|
49
|
+
### Commit Messages
|
|
50
|
+
|
|
51
|
+
Follow [Conventional Commits](https://www.conventionalcommits.org/):
|
|
52
|
+
|
|
53
|
+
```
|
|
54
|
+
feat: add new layout type
|
|
55
|
+
fix: correct slide ordering bug
|
|
56
|
+
docs: update theming guide
|
|
57
|
+
test: add tests for cell renderer
|
|
58
|
+
chore: update dependencies
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## Submitting Changes
|
|
62
|
+
|
|
63
|
+
1. Push to your fork
|
|
64
|
+
2. Create a Pull Request
|
|
65
|
+
3. Describe what your PR does
|
|
66
|
+
4. Link any related issues
|
|
67
|
+
5. Ensure CI passes
|
|
68
|
+
6. Request review
|
|
69
|
+
|
|
70
|
+
## Adding Features
|
|
71
|
+
|
|
72
|
+
### New Slide Layouts
|
|
73
|
+
|
|
74
|
+
1. Add to `LAYOUTS` in `src/components/LayoutSelector.tsx`
|
|
75
|
+
2. Add CSS in `jupypress/templates/static/css/base.css`
|
|
76
|
+
3. Update `slide_builder.py` validation
|
|
77
|
+
4. Write tests
|
|
78
|
+
|
|
79
|
+
### New Themes
|
|
80
|
+
|
|
81
|
+
1. Create `jupypress/templates/themes/my-theme/theme.css`
|
|
82
|
+
2. Define CSS variables
|
|
83
|
+
3. Add tests
|
|
84
|
+
4. Document in README
|
|
85
|
+
|
|
86
|
+
### New Renderers
|
|
87
|
+
|
|
88
|
+
1. Extend `CellRenderer` in `jupypress/cell_renderer.py`
|
|
89
|
+
2. Add MIME type handler
|
|
90
|
+
3. Write tests with sample outputs
|
|
91
|
+
|
|
92
|
+
## Documentation
|
|
93
|
+
|
|
94
|
+
- Update README.md for user-facing changes
|
|
95
|
+
- Add docstrings to Python functions
|
|
96
|
+
- Add JSDoc comments to TypeScript
|
|
97
|
+
- Update docs/DEVELOPMENT.md for setup changes
|
|
98
|
+
|
|
99
|
+
## Performance
|
|
100
|
+
|
|
101
|
+
- Profile before optimizing
|
|
102
|
+
- Consider notebook size (large notebooks should still export quickly)
|
|
103
|
+
- Minimize CSS/JS bundle size
|
|
104
|
+
- Cache theme parsing
|
|
105
|
+
|
|
106
|
+
## Accessibility
|
|
107
|
+
|
|
108
|
+
- Ensure keyboard navigation works
|
|
109
|
+
- Add ARIA labels to UI components
|
|
110
|
+
- Test with screen readers
|
|
111
|
+
- Maintain color contrast ratios
|
|
112
|
+
|
|
113
|
+
## Security
|
|
114
|
+
|
|
115
|
+
- Validate file paths (prevent directory traversal)
|
|
116
|
+
- Escape HTML properly
|
|
117
|
+
- Don't execute untrusted code by default
|
|
118
|
+
- Review dependencies for vulnerabilities
|
|
119
|
+
|
|
120
|
+
## Questions?
|
|
121
|
+
|
|
122
|
+
- Check existing issues
|
|
123
|
+
- Start a discussion
|
|
124
|
+
- Contact maintainers
|
|
125
|
+
|
|
126
|
+
Thank you for contributing!
|
jupypress-0.1.0/LICENSE
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
BSD 3-Clause License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026, JupyPress Contributors
|
|
4
|
+
|
|
5
|
+
Redistribution and use in source and binary forms, with or without
|
|
6
|
+
modification, are permitted provided that the following conditions are met:
|
|
7
|
+
|
|
8
|
+
1. Redistributions of source code must retain the above copyright notice, this
|
|
9
|
+
list of conditions and the following disclaimer.
|
|
10
|
+
|
|
11
|
+
2. Redistributions in binary form must reproduce the above copyright notice,
|
|
12
|
+
this list of conditions and the following disclaimer in the documentation
|
|
13
|
+
and/or other materials provided with the distribution.
|
|
14
|
+
|
|
15
|
+
3. Neither the name of the copyright holder nor the names of its
|
|
16
|
+
contributors may be used to endorse or promote products derived from
|
|
17
|
+
this software without specific prior written permission.
|
|
18
|
+
|
|
19
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
20
|
+
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
21
|
+
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
22
|
+
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
23
|
+
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
24
|
+
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
25
|
+
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
26
|
+
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
27
|
+
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
28
|
+
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
recursive-include jupypress/templates *
|
|
2
|
+
recursive-include jupypress/labextension *
|
|
3
|
+
recursive-include jupypress *.py
|
|
4
|
+
global-exclude node_modules
|
|
5
|
+
global-exclude .yarn
|
|
6
|
+
global-exclude .git
|
|
7
|
+
global-exclude __pycache__
|
|
8
|
+
global-exclude *.pyc
|
|
9
|
+
global-exclude .pytest_cache
|
|
10
|
+
global-exclude .ruff_cache
|
jupypress-0.1.0/PKG-INFO
ADDED
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: jupypress
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: A JupyterLab extension for converting notebooks into HTML slide presentations
|
|
5
|
+
Project-URL: Homepage, https://github.com/andibuwono/jupypress
|
|
6
|
+
Project-URL: Repository, https://github.com/andibuwono/jupypress
|
|
7
|
+
Project-URL: Issues, https://github.com/andibuwono/jupypress/issues
|
|
8
|
+
Project-URL: Documentation, https://github.com/andibuwono/jupypress#readme
|
|
9
|
+
Project-URL: Changelog, https://github.com/andibuwono/jupypress/blob/main/CHANGELOG.md
|
|
10
|
+
Author: JupyPress Contributors
|
|
11
|
+
License: BSD 3-Clause License
|
|
12
|
+
|
|
13
|
+
Copyright (c) 2026, JupyPress Contributors
|
|
14
|
+
|
|
15
|
+
Redistribution and use in source and binary forms, with or without
|
|
16
|
+
modification, are permitted provided that the following conditions are met:
|
|
17
|
+
|
|
18
|
+
1. Redistributions of source code must retain the above copyright notice, this
|
|
19
|
+
list of conditions and the following disclaimer.
|
|
20
|
+
|
|
21
|
+
2. Redistributions in binary form must reproduce the above copyright notice,
|
|
22
|
+
this list of conditions and the following disclaimer in the documentation
|
|
23
|
+
and/or other materials provided with the distribution.
|
|
24
|
+
|
|
25
|
+
3. Neither the name of the copyright holder nor the names of its
|
|
26
|
+
contributors may be used to endorse or promote products derived from
|
|
27
|
+
this software without specific prior written permission.
|
|
28
|
+
|
|
29
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
30
|
+
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
31
|
+
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
32
|
+
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
33
|
+
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
34
|
+
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
35
|
+
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
36
|
+
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
37
|
+
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
38
|
+
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
39
|
+
License-File: LICENSE
|
|
40
|
+
Keywords: html,jupyter,jupyterlab,presentation,slides
|
|
41
|
+
Classifier: Development Status :: 3 - Alpha
|
|
42
|
+
Classifier: Framework :: Jupyter
|
|
43
|
+
Classifier: Framework :: Jupyter :: JupyterLab
|
|
44
|
+
Classifier: Framework :: Jupyter :: JupyterLab :: 4
|
|
45
|
+
Classifier: Intended Audience :: Developers
|
|
46
|
+
Classifier: Intended Audience :: Science/Research
|
|
47
|
+
Classifier: License :: OSI Approved :: BSD License
|
|
48
|
+
Classifier: Programming Language :: Python :: 3
|
|
49
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
50
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
51
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
52
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
53
|
+
Classifier: Topic :: Scientific/Engineering :: Visualization
|
|
54
|
+
Requires-Python: >=3.10
|
|
55
|
+
Requires-Dist: jinja2>=3.1.0
|
|
56
|
+
Requires-Dist: jupyter-core>=5.0.0
|
|
57
|
+
Requires-Dist: jupyter-server<3,>=2.0.0
|
|
58
|
+
Requires-Dist: markdown-it-py>=3.0.0
|
|
59
|
+
Requires-Dist: nbconvert>=7.8.0
|
|
60
|
+
Requires-Dist: nbformat>=5.9.0
|
|
61
|
+
Requires-Dist: pygments>=2.16.0
|
|
62
|
+
Provides-Extra: dev
|
|
63
|
+
Requires-Dist: build; extra == 'dev'
|
|
64
|
+
Requires-Dist: hatch; extra == 'dev'
|
|
65
|
+
Requires-Dist: pre-commit; extra == 'dev'
|
|
66
|
+
Requires-Dist: ruff>=0.1.0; extra == 'dev'
|
|
67
|
+
Requires-Dist: twine; extra == 'dev'
|
|
68
|
+
Provides-Extra: test
|
|
69
|
+
Requires-Dist: jupyter-server[test]>=2.0.0; extra == 'test'
|
|
70
|
+
Requires-Dist: pytest-asyncio; extra == 'test'
|
|
71
|
+
Requires-Dist: pytest>=7.0; extra == 'test'
|
|
72
|
+
Description-Content-Type: text/markdown
|
|
73
|
+
|
|
74
|
+
# JupyPress
|
|
75
|
+
|
|
76
|
+
JupyPress is a JupyterLab extension for turning notebooks into HTML slide presentations.
|
|
77
|
+
|
|
78
|
+
It supports two output paths:
|
|
79
|
+
|
|
80
|
+
- JupyterLab-backed preview and present modes for live notebook outputs, widgets, and live code execution.
|
|
81
|
+
- Standalone HTML export for static, shareable presentations that do not require a running kernel.
|
|
82
|
+
|
|
83
|
+
## Requirements
|
|
84
|
+
|
|
85
|
+
- Python 3.10 or newer
|
|
86
|
+
- JupyterLab 4.x
|
|
87
|
+
- A modern Chromium, Firefox, or Safari browser
|
|
88
|
+
|
|
89
|
+
## Installation
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
pip install jupypress
|
|
93
|
+
jupyter lab
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
Open a notebook, then use the JupyPress toolbar button or the command palette command `JupyPress: Open Editor`.
|
|
97
|
+
|
|
98
|
+
## Basic Usage
|
|
99
|
+
|
|
100
|
+
1. Create slides in the JupyPress editor.
|
|
101
|
+
2. Choose a slide layout.
|
|
102
|
+
3. Assign notebook cells to slide slots.
|
|
103
|
+
4. Use preview for JupyterLab-backed rendering.
|
|
104
|
+
5. Use present mode for a browser presentation backed by the active notebook session.
|
|
105
|
+
6. Export to HTML for a static file that can be opened without JupyterLab.
|
|
106
|
+
|
|
107
|
+
## Features
|
|
108
|
+
|
|
109
|
+
- Slide metadata stored directly in the notebook.
|
|
110
|
+
- Built-in layouts for title, content, two-column, and multi-row slides.
|
|
111
|
+
- JupyterLab-backed preview and present modes using notebook output areas.
|
|
112
|
+
- Static HTML export with embedded presentation CSS and navigation.
|
|
113
|
+
- Theme support through CSS variables.
|
|
114
|
+
- Markdown, code, rich outputs, images, Plotly, Leaflet/Folium, and saved widget output support.
|
|
115
|
+
- Live code execution in JupyterLab-backed presentation mode.
|
|
116
|
+
|
|
117
|
+
## Output Modes
|
|
118
|
+
|
|
119
|
+
### Preview and Present
|
|
120
|
+
|
|
121
|
+
Preview and present modes run inside the JupyterLab environment and render assigned cells with JupyterLab output areas. This is the right mode for live notebook work, active kernels, widgets, and outputs that need JupyterLab renderers.
|
|
122
|
+
|
|
123
|
+
### HTML Export
|
|
124
|
+
|
|
125
|
+
HTML export creates a standalone static presentation. The exported file is designed for sharing and viewing without JupyterLab. Dynamic widget kernels are not available in this mode, but saved/static DOM output is included where possible.
|
|
126
|
+
|
|
127
|
+
## Screenshots
|
|
128
|
+
|
|
129
|
+
Release screenshots are stored under `docs/images/`:
|
|
130
|
+
|
|
131
|
+
- `docs/images/editor.png`
|
|
132
|
+
- `docs/images/export-html.png`
|
|
133
|
+
- `docs/images/launch.png`
|
|
134
|
+
- `docs/images/present-livecode.png`
|
|
135
|
+
|
|
136
|
+
See `docs/images/README.md` for the intended use of each capture.
|
|
137
|
+
|
|
138
|
+
## Development
|
|
139
|
+
|
|
140
|
+
```bash
|
|
141
|
+
git clone https://github.com/andibuwono/jupypress.git
|
|
142
|
+
cd jupypress
|
|
143
|
+
jlpm install
|
|
144
|
+
jlpm run build:labextension
|
|
145
|
+
python -m build
|
|
146
|
+
pip install --force-reinstall ./dist/jupypress-0.1.0-py3-none-any.whl
|
|
147
|
+
jupyter lab
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
Use `jlpm` rather than `npm`; JupyterLab manages the Yarn environment.
|
|
151
|
+
|
|
152
|
+
See:
|
|
153
|
+
|
|
154
|
+
- `docs/DEVELOPMENT.md` for local setup and development workflow.
|
|
155
|
+
- `docs/BACKEND_STRUCTURE.md` for the Python backend map.
|
|
156
|
+
- `docs/FRONTEND_STRUCTURE.md` for the TypeScript/React frontend map.
|
|
157
|
+
- `docs/TEST.md` for test commands.
|
|
158
|
+
- `docs/theming.md` for theme variables.
|
|
159
|
+
|
|
160
|
+
## Testing
|
|
161
|
+
|
|
162
|
+
```bash
|
|
163
|
+
hatch run test
|
|
164
|
+
jlpm run test
|
|
165
|
+
jlpm run build:labextension
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
## Release
|
|
169
|
+
|
|
170
|
+
See `docs/RELEASE.md` for the PyPI and GitHub release checklist.
|
|
171
|
+
|
|
172
|
+
## Contributing
|
|
173
|
+
|
|
174
|
+
Contributions are welcome. See `CONTRIBUTING.md` and `CODE_OF_CONDUCT.md`.
|
|
175
|
+
|
|
176
|
+
## License
|
|
177
|
+
|
|
178
|
+
JupyPress is distributed under the BSD 3-Clause License. See `LICENSE`.
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
# JupyPress
|
|
2
|
+
|
|
3
|
+
JupyPress is a JupyterLab extension for turning notebooks into HTML slide presentations.
|
|
4
|
+
|
|
5
|
+
It supports two output paths:
|
|
6
|
+
|
|
7
|
+
- JupyterLab-backed preview and present modes for live notebook outputs, widgets, and live code execution.
|
|
8
|
+
- Standalone HTML export for static, shareable presentations that do not require a running kernel.
|
|
9
|
+
|
|
10
|
+
## Requirements
|
|
11
|
+
|
|
12
|
+
- Python 3.10 or newer
|
|
13
|
+
- JupyterLab 4.x
|
|
14
|
+
- A modern Chromium, Firefox, or Safari browser
|
|
15
|
+
|
|
16
|
+
## Installation
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
pip install jupypress
|
|
20
|
+
jupyter lab
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
Open a notebook, then use the JupyPress toolbar button or the command palette command `JupyPress: Open Editor`.
|
|
24
|
+
|
|
25
|
+
## Basic Usage
|
|
26
|
+
|
|
27
|
+
1. Create slides in the JupyPress editor.
|
|
28
|
+
2. Choose a slide layout.
|
|
29
|
+
3. Assign notebook cells to slide slots.
|
|
30
|
+
4. Use preview for JupyterLab-backed rendering.
|
|
31
|
+
5. Use present mode for a browser presentation backed by the active notebook session.
|
|
32
|
+
6. Export to HTML for a static file that can be opened without JupyterLab.
|
|
33
|
+
|
|
34
|
+
## Features
|
|
35
|
+
|
|
36
|
+
- Slide metadata stored directly in the notebook.
|
|
37
|
+
- Built-in layouts for title, content, two-column, and multi-row slides.
|
|
38
|
+
- JupyterLab-backed preview and present modes using notebook output areas.
|
|
39
|
+
- Static HTML export with embedded presentation CSS and navigation.
|
|
40
|
+
- Theme support through CSS variables.
|
|
41
|
+
- Markdown, code, rich outputs, images, Plotly, Leaflet/Folium, and saved widget output support.
|
|
42
|
+
- Live code execution in JupyterLab-backed presentation mode.
|
|
43
|
+
|
|
44
|
+
## Output Modes
|
|
45
|
+
|
|
46
|
+
### Preview and Present
|
|
47
|
+
|
|
48
|
+
Preview and present modes run inside the JupyterLab environment and render assigned cells with JupyterLab output areas. This is the right mode for live notebook work, active kernels, widgets, and outputs that need JupyterLab renderers.
|
|
49
|
+
|
|
50
|
+
### HTML Export
|
|
51
|
+
|
|
52
|
+
HTML export creates a standalone static presentation. The exported file is designed for sharing and viewing without JupyterLab. Dynamic widget kernels are not available in this mode, but saved/static DOM output is included where possible.
|
|
53
|
+
|
|
54
|
+
## Screenshots
|
|
55
|
+
|
|
56
|
+
Release screenshots are stored under `docs/images/`:
|
|
57
|
+
|
|
58
|
+
- `docs/images/editor.png`
|
|
59
|
+
- `docs/images/export-html.png`
|
|
60
|
+
- `docs/images/launch.png`
|
|
61
|
+
- `docs/images/present-livecode.png`
|
|
62
|
+
|
|
63
|
+
See `docs/images/README.md` for the intended use of each capture.
|
|
64
|
+
|
|
65
|
+
## Development
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
git clone https://github.com/andibuwono/jupypress.git
|
|
69
|
+
cd jupypress
|
|
70
|
+
jlpm install
|
|
71
|
+
jlpm run build:labextension
|
|
72
|
+
python -m build
|
|
73
|
+
pip install --force-reinstall ./dist/jupypress-0.1.0-py3-none-any.whl
|
|
74
|
+
jupyter lab
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
Use `jlpm` rather than `npm`; JupyterLab manages the Yarn environment.
|
|
78
|
+
|
|
79
|
+
See:
|
|
80
|
+
|
|
81
|
+
- `docs/DEVELOPMENT.md` for local setup and development workflow.
|
|
82
|
+
- `docs/BACKEND_STRUCTURE.md` for the Python backend map.
|
|
83
|
+
- `docs/FRONTEND_STRUCTURE.md` for the TypeScript/React frontend map.
|
|
84
|
+
- `docs/TEST.md` for test commands.
|
|
85
|
+
- `docs/theming.md` for theme variables.
|
|
86
|
+
|
|
87
|
+
## Testing
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
hatch run test
|
|
91
|
+
jlpm run test
|
|
92
|
+
jlpm run build:labextension
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
## Release
|
|
96
|
+
|
|
97
|
+
See `docs/RELEASE.md` for the PyPI and GitHub release checklist.
|
|
98
|
+
|
|
99
|
+
## Contributing
|
|
100
|
+
|
|
101
|
+
Contributions are welcome. See `CONTRIBUTING.md` and `CODE_OF_CONDUCT.md`.
|
|
102
|
+
|
|
103
|
+
## License
|
|
104
|
+
|
|
105
|
+
JupyPress is distributed under the BSD 3-Clause License. See `LICENSE`.
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# Security Policy
|
|
2
|
+
|
|
3
|
+
## Supported Versions
|
|
4
|
+
|
|
5
|
+
Security fixes are provided for the latest released version of JupyPress.
|
|
6
|
+
|
|
7
|
+
## Reporting a Vulnerability
|
|
8
|
+
|
|
9
|
+
Please report security issues using GitHub private vulnerability reporting if it is enabled for the repository. If private reporting is not available, open a GitHub issue with a minimal description and avoid including exploit details publicly.
|
|
10
|
+
|
|
11
|
+
Include:
|
|
12
|
+
|
|
13
|
+
- Affected JupyPress version
|
|
14
|
+
- JupyterLab and Python versions
|
|
15
|
+
- Reproduction steps
|
|
16
|
+
- Expected and actual behavior
|
|
17
|
+
- Any relevant notebook or export configuration, with sensitive data removed
|
|
18
|
+
|
|
19
|
+
Maintainers will confirm receipt, assess impact, and coordinate a fix before public disclosure where appropriate.
|