Class: Markawesome::VideoTransformer
- Inherits:
-
BaseTransformer
- Object
- BaseTransformer
- Markawesome::VideoTransformer
- Defined in:
- lib/markawesome/transformers/video_transformer.rb
Overview
Transforms video syntax into Web Awesome’s two media components:
<wa-video> — a single embedded video with custom controls
<wa-video-playlist> — a playlist wrapping multiple <wa-video> children
Single video
Primary: ;;;tokens\n[Title](src)\n\n;;;
Alternative: :::wa-video tokens\n…\n:::
Playlist (a ;;;;;; container wrapping bare ;;; items, mirroring carousel)
Primary: ;;;;;;tokens\n;;;\n[Title](src)\n;;;\n…\n;;;;;;
Alternative: :::wa-video-playlist tokens\n;;;\n…\n;;;\n:::
Body: the first markdown link ‘[text](url)` supplies `title`/`src`; the first markdown image `` supplies `poster`. A block with no link (no `src`) is left untransformed.
Tokens: ‘controls:none|standard|full` and `preload:auto|metadata|none` (enum-validated, invalid values dropped) plus the boolean flags `autoplay`, `autoplay-muted`, `autoplay-on-visible`, `loop`, `muted`. Playlist children omit `controls` (the container forwards it to each child).
Constant Summary collapse
- VIDEO_FLAGS =
Boolean flags, matched as whole tokens so ‘autoplay-muted` never triggers `autoplay`. Parsed via AttributeParser (rightmost-wins, order-independent).
{ autoplay: %w[autoplay], 'autoplay-muted': %w[autoplay-muted], 'autoplay-on-visible': %w[autoplay-on-visible], loop: %w[loop], muted: %w[muted] }.freeze
- FLAG_ORDER =
Deterministic emission order for the boolean flags.
%w[autoplay autoplay-muted autoplay-on-visible loop muted].freeze
- CONTROLS_VALUES =
%w[none standard full].freeze
- PRELOAD_VALUES =
%w[auto metadata none].freeze
- PLAYLIST_PRIMARY =
Playlist consumes its inner ;;; items first; the bare ‘;;;n` item open (no params) is load-bearing — it stops the closing `;;;;;;` from being mis-read as another item (mirrors carousel’s ‘~~~`/`~~~~~~` trick).
/^;{6}([^\n]*)\n((?:;;;\n(?:.*?\n)?;;;\n?)+);{6}/m- PLAYLIST_ALT =
/^:::wa-video-playlist\s*([^\n]*)\n(.*?)\n:::/m- SINGLE_PRIMARY =
‘(?!;)` keeps the single open from matching a leftover `;;;;;;` fence.
/^;;;(?!;)([^\n]*)\n(.*?)\n^;;;$/m- SINGLE_ALT =
/^:::wa-video\s*([^\n]*)\n(.*?)\n:::/m- ITEM_REGEX =
/;;;\n(.*?);;;(?:\n|$)/m- LINK_REGEX =
First markdown link that is not the ‘![…]()` of an image (negative lookbehind on `!`) → title + src.
/(?<!!)\[([^\]]+)\]\(([^)]+)\)/- IMAGE_REGEX =
First markdown image → poster.
/!\[([^\]]*)\]\(([^)]+)\)/
Class Method Summary collapse
Class Method Details
.render_as_markdown(content, _options = {}) ⇒ Object
70 71 72 73 74 75 76 77 78 |
# File 'lib/markawesome/transformers/video_transformer.rb', line 70 def self.render_as_markdown(content, = {}) patterns = [ { regex: PLAYLIST_PRIMARY, block: proc { |_m, md| render_playlist_markdown(md[2]) } }, { regex: PLAYLIST_ALT, block: proc { |_m, md| render_playlist_markdown(md[2]) } }, { regex: SINGLE_PRIMARY, block: proc { |m, md| render_single_markdown(md[2]) || m } }, { regex: SINGLE_ALT, block: proc { |m, md| render_single_markdown(md[2]) || m } } ] apply_multiple_patterns(content, patterns) end |
.transform(content) ⇒ Object
60 61 62 63 64 65 66 67 68 |
# File 'lib/markawesome/transformers/video_transformer.rb', line 60 def self.transform(content) patterns = [ { regex: PLAYLIST_PRIMARY, block: proc { |_m, md| build_playlist(md[1], md[2]) } }, { regex: PLAYLIST_ALT, block: proc { |_m, md| build_playlist(md[1], md[2]) } }, { regex: SINGLE_PRIMARY, block: proc { |m, md| build_single(md[1], md[2]) || m } }, { regex: SINGLE_ALT, block: proc { |m, md| build_single(md[1], md[2]) || m } } ] apply_multiple_patterns(content, patterns) end |