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\nTitle\nPoster\n;;; Alternative: :::wa-video tokens\n…\n:::

Playlist (a ;;;;;; container wrapping bare ;;; items, mirroring carousel) Primary: ;;;;;;tokens\n;;;\nTitle\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