Class: Markawesome::VideoTransformer

Inherits:
BaseTransformer show all
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![Poster](poster)\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 `![alt](url)` 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
/(?<!!)\[([^\]]+)\]\(([^)]+)\)/
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, _options = {})
  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