presently 0.17.0 → 0.17.1
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.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/context/getting-started.md +92 -2
- data/lib/presently/version.rb +1 -1
- data/public/_components/@socketry/syntax/Syntax/Language/ruby.js +8 -4
- data/public/_components/@socketry/syntax/package.json +1 -1
- data/readme.md +5 -15
- data/releases.md +1 -1
- data.tar.gz.sig +0 -0
- metadata +1 -1
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 76e4ab0cea03d4eefe8864d4c81f0193615ba5bb4548d65d19fd93992408a746
|
|
4
|
+
data.tar.gz: b2315554cb96689cf429c04d3a914525cc3294f5e01bb1cc39b0cf7a475d8b6d
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 34fbbeee043bbdd4241049e639388661808245d0d3001256d979745199074c30a867ffc4782f30a728d494453fdadf723589ff3f44f44f08a2dd65b11bdb3b50
|
|
7
|
+
data.tar.gz: eb40ee8ba2bfa106b86e9641ece873ae27043e137c0fe3ae69ff714e24562b1b01d4a58de15681655e74348a4bcbec9f965c8bc6ac65166d63bf7c4378c58282
|
checksums.yaml.gz.sig
CHANGED
|
Binary file
|
data/context/getting-started.md
CHANGED
|
@@ -79,6 +79,43 @@ Each slide has three parts:
|
|
|
79
79
|
2. **Content** with Markdown headings that become named sections for the template.
|
|
80
80
|
3. **Presenter notes** after a `---` separator in the body (optional).
|
|
81
81
|
|
|
82
|
+
### Styling Slides
|
|
83
|
+
|
|
84
|
+
CSS can be colocated with the slides it styles:
|
|
85
|
+
|
|
86
|
+
``` text
|
|
87
|
+
slides/
|
|
88
|
+
├── style.css
|
|
89
|
+
├── 010-introduction.md
|
|
90
|
+
└── 020-scheduling/
|
|
91
|
+
├── style.css
|
|
92
|
+
├── 010-overview.md
|
|
93
|
+
├── 020-queue.md
|
|
94
|
+
└── 020-queue.css
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
`slides/style.css` applies globally. A nested `style.css` applies to every slide below that directory, while a CSS file matching a Markdown filename applies only to that slide. In the example above, `020-scheduling/style.css` applies to both scheduling slides and `020-queue.css` applies only to `020-queue.md`.
|
|
98
|
+
|
|
99
|
+
Presently automatically wraps nested and slide-specific stylesheets in an [`@scope`](https://developer.mozilla.org/en-US/docs/Web/CSS/@scope) rule rooted at the rendered slide. Write these files as scoped CSS fragments containing ordinary style rules and nestable grouping rules such as `@media`, `@supports`, `@container`, and `@layer`. Keep stylesheet-level rules such as `@charset`, `@import`, and `@namespace`, and globally named definitions such as `@font-face`, `@keyframes`, and `@property`, in the root `slides/style.css` or the existing `public/_static/custom.css`.
|
|
100
|
+
|
|
101
|
+
Relative images and fonts remain adjacent to the stylesheet that uses them:
|
|
102
|
+
|
|
103
|
+
``` css
|
|
104
|
+
.architecture {
|
|
105
|
+
background-image: url("architecture.svg");
|
|
106
|
+
}
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
Presently uses `protocol-media-registry` to determine asset content types. Files with unrecognized media types are not served.
|
|
110
|
+
|
|
111
|
+
Relative images embedded in Markdown resolve from the Markdown file's directory, including images in included Markdown files:
|
|
112
|
+
|
|
113
|
+
``` markdown
|
|
114
|
+

|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
Presently loads each discovered stylesheet once in deterministic presentation order. Directory styles are loaded from parent to child before the matching slide sidecar, so more specific styles naturally appear later in the cascade. The same stylesheets are used by the display, presenter, recorder, playback, and export interfaces.
|
|
118
|
+
|
|
82
119
|
### Running the Presentation
|
|
83
120
|
|
|
84
121
|
Start the server from your presentation directory:
|
|
@@ -87,13 +124,66 @@ Start the server from your presentation directory:
|
|
|
87
124
|
$ presently
|
|
88
125
|
```
|
|
89
126
|
|
|
90
|
-
|
|
127
|
+
Open the launcher, or go directly to one of the presentation interfaces:
|
|
91
128
|
|
|
92
|
-
- `http://localhost:9292/` — the
|
|
129
|
+
- `http://localhost:9292/` — the interface launcher.
|
|
130
|
+
- `http://localhost:9292/display` — the audience display.
|
|
93
131
|
- `http://localhost:9292/presenter` — the presenter console.
|
|
132
|
+
- `http://localhost:9292/record` — the slide narration recorder.
|
|
133
|
+
- `http://localhost:9292/playback` — automatic playback with recorded narration.
|
|
94
134
|
|
|
95
135
|
Advancing slides in either window updates both in real-time via WebSockets.
|
|
96
136
|
|
|
137
|
+
### Recording Slide Narration
|
|
138
|
+
|
|
139
|
+
The recording interface is separate from the presenter console because narration is an authoring workflow: each slide can be recorded, reviewed, retaken, and explicitly saved without changing the live presentation controls.
|
|
140
|
+
|
|
141
|
+
Presently records WebM/Opus audio using the browser microphone, preserving its dynamics for offline normalization. A short delayed audio pipeline excludes approximately 100 milliseconds around the mouse clicks at the beginning and end. Saved recording paths mirror their slide paths under the presentation's `audio/` directory:
|
|
142
|
+
|
|
143
|
+
``` text
|
|
144
|
+
slides/020-problem/010-overview.md
|
|
145
|
+
audio/020-problem/010-overview.webm
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
To record narration:
|
|
149
|
+
|
|
150
|
+
1. Open `http://localhost:9292/record` in a browser with WebM/Opus `MediaRecorder` support.
|
|
151
|
+
2. Select the slide and press **Record**.
|
|
152
|
+
3. Press **Stop**, then review the recording with the audio player.
|
|
153
|
+
4. Press **Save** to replace that slide's existing narration.
|
|
154
|
+
|
|
155
|
+
Navigating away before saving discards the retake and preserves the previously saved recording.
|
|
156
|
+
|
|
157
|
+
To normalize completed takes to a consistent `-16 LUFS` target, install FFmpeg and run:
|
|
158
|
+
|
|
159
|
+
``` shell
|
|
160
|
+
bundle exec bake presently:recordings:normalize
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
Originals remain under `audio/`; normalized WebM/Opus copies are written under `audio-normalized/` using the same relative paths. The task skips outputs that are newer than their source, so it can be rerun after recording additional slides.
|
|
164
|
+
|
|
165
|
+
### Playing Recorded Narration
|
|
166
|
+
|
|
167
|
+
Open `http://localhost:9292/playback` after every slide has a recording. Press **Start presentation** and Presently will play each narration track, run the slide's script, preserve its transition, and advance when the narration ends. Normalized recordings are preferred, with the corresponding original recording used as a fallback.
|
|
168
|
+
|
|
169
|
+
For browser automation or video capture, open:
|
|
170
|
+
|
|
171
|
+
``` text
|
|
172
|
+
http://localhost:9292/playback?autoplay=true&controls=false
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
The playback page sets `window.__PRESENTLY_PLAYBACK_READY` after its slides, fonts, syntax highlighting, and audio metadata are loaded. It sets `window.__PRESENTLY_PLAYBACK_FINISHED` when the final narration ends. It also dispatches `presently:playback-ready` and `presently:playback-finished` events for event-driven integrations.
|
|
176
|
+
|
|
177
|
+
To export the narrated presentation directly to MP4, use a Chromium and matching ChromeDriver build that supports the experimental `Page.startScreenRecording` DevTools command:
|
|
178
|
+
|
|
179
|
+
``` shell
|
|
180
|
+
PRESENTLY_CHROME_PATH=/path/to/chromium \
|
|
181
|
+
PRESENTLY_CHROMEDRIVER_PATH=/path/to/chromedriver \
|
|
182
|
+
bundle exec bake presently:export:video output=presentation.mp4
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
The defaults are 1920×1080 at up to 30 frames per second. The exporter starts an isolated Presently server, waits for playback to become ready, records until the final narration ends, and writes Chromium's MP4 stream to the selected output path.
|
|
186
|
+
|
|
97
187
|
### Keyboard Controls
|
|
98
188
|
|
|
99
189
|
- **Arrow Right / Space / Page Down** — next slide.
|
data/lib/presently/version.rb
CHANGED
|
@@ -4,11 +4,15 @@ import {Match} from '../Match.js';
|
|
|
4
4
|
|
|
5
5
|
const language = new Language('ruby');
|
|
6
6
|
|
|
7
|
-
// Ruby-style function definitions and method calls (def foo, .bar)
|
|
8
|
-
//
|
|
7
|
+
// Ruby-style function definitions and method calls (def foo, .bar).
|
|
8
|
+
// Predicate and bang methods are also unambiguous without a receiver or arguments.
|
|
9
9
|
const rubyStyleFunction = {
|
|
10
|
-
pattern:
|
|
11
|
-
|
|
10
|
+
pattern:
|
|
11
|
+
/(?:def\s+|\.)([a-z_][a-z0-9_]*[?!]?)|(^|[^\w.:])([a-z_][a-z0-9_]*[?!])(?!:)/i,
|
|
12
|
+
matches: Rule.extractMatches(
|
|
13
|
+
{index: 1, type: 'function'},
|
|
14
|
+
{index: 3, type: 'function'}
|
|
15
|
+
)
|
|
12
16
|
};
|
|
13
17
|
|
|
14
18
|
// Emulate negative lookbehind to avoid matching ::symbol (only match :symbol not ::symbol)
|
data/readme.md
CHANGED
|
@@ -24,8 +24,6 @@ A web-based presentation tool built with [Lively](https://github.com/socketry/li
|
|
|
24
24
|
|
|
25
25
|
Please see the [project documentation](https://socketry.github.io/presently/) for more details.
|
|
26
26
|
|
|
27
|
-
After starting Presently, open `http://localhost:9292/` to choose between the audience display, presenter console, narration recorder, and narrated playback interfaces.
|
|
28
|
-
|
|
29
27
|
- [Getting Started](https://socketry.github.io/presently/guides/getting-started/index) - This guide explains how to use `presently` to create and deliver web-based presentations using Markdown slides.
|
|
30
28
|
|
|
31
29
|
- [Animating Slides](https://socketry.github.io/presently/guides/animating-slides/index) - This guide explains how to animate content within slides using the slide scripting system.
|
|
@@ -67,6 +65,11 @@ The task records the presentation at 1920×1080 and 30 frames per second by defa
|
|
|
67
65
|
|
|
68
66
|
Please see the [project releases](https://socketry.github.io/presently/releases/index) for all releases.
|
|
69
67
|
|
|
68
|
+
### v0.17.1
|
|
69
|
+
|
|
70
|
+
- Add slide-scoped resource cleanup with `Slide#defer`, `Slide#signal`, and idempotent `Slide#dispose`. Existing tracked timeouts now use the same disposal lifecycle.
|
|
71
|
+
- [Web Packages](https://socketry.github.io/presently/releases/index#web-packages)
|
|
72
|
+
|
|
70
73
|
### v0.16.0
|
|
71
74
|
|
|
72
75
|
- Add support for organizing slides in nested directories. Every directory and slide filename must begin with a numeric prefix, and slides are ordered by relative path.
|
|
@@ -109,19 +112,6 @@ q
|
|
|
109
112
|
|
|
110
113
|
- Add optional `translation` section to the `default` template.
|
|
111
114
|
|
|
112
|
-
### v0.7.0
|
|
113
|
-
|
|
114
|
-
- Rework build effects to use direct CSS class animation rather than `view-transition-class`. `build-fade`, `build-fly-up`, etc. are now regular `@keyframes` classes applied to the revealed element, rather than view transition pseudo-element selectors. This decouples in-slide sequential animation from slide-level morph transitions.
|
|
115
|
-
- Rename `SlideElements#build` to `SlideElements#show` for clarity — `boxes.show(0)` / `boxes.show(3)` more clearly describes the outcome from the audience's perspective.
|
|
116
|
-
- Add `SlideElements#builder(options)` — returns a `SlideBuilder` with default options (group, effect) and a cached position, so callers can use `next()` instead of tracking the step count manually.
|
|
117
|
-
- Add `SlideBuilder#show(count, overrides)` — set visibility state to an arbitrary position. Returns a `Promise` that resolves when the reveal animation completes (or immediately when no effect is given).
|
|
118
|
-
- Add `SlideBuilder#next(overrides)` — reveal the next element with the builder's default effect, optionally overridden per call. O(1): only touches the single newly revealed element. Returns a `Promise`.
|
|
119
|
-
- Add `SlideBuilder#play(interval, callback)` — reveals all remaining elements in sequence with `interval` milliseconds between each. An optional callback is invoked after each reveal; return `false` to stop playback early. Requires the builder to be created via `slide.find(...).builder()` so timeouts are tracked and cancelled on slide change.
|
|
120
|
-
- Add `SlideBuilder#finished` getter — returns `true` when all elements have been revealed.
|
|
121
|
-
- Add `Slide#after(delay, callback)` — schedules a callback after a delay in milliseconds and returns a `SlideChain`. Subsequent `.after(delay, callback)` calls on the chain fire relative to the previous step, making sequential reveal timing easy to read and adjust.
|
|
122
|
-
- Add `Slide#setTimeout(callback, delay)` — a tracked replacement for the global `setTimeout`. All timeouts registered this way are automatically cancelled when the slide changes, preventing stale callbacks from firing after navigation. The global `setTimeout` in slide scripts is shadowed by this method automatically.
|
|
123
|
-
- Add `Slide#cancelTimeouts()` — cancels all pending timeouts registered by the slide's script. Called automatically by the presentation engine on every slide change.
|
|
124
|
-
|
|
125
115
|
## See Also
|
|
126
116
|
|
|
127
117
|
- [lively](https://github.com/socketry/lively) — The real-time application framework that powers Presently.
|
data/releases.md
CHANGED
data.tar.gz.sig
CHANGED
|
Binary file
|
metadata
CHANGED
metadata.gz.sig
CHANGED
|
Binary file
|