Files
plainleaf/Library/Std/Embed.md
T
Zef Hemel 45b767fd3c Lua widgets: html can now also be a DOM node
Encoding some more space lua priorities and documenting them
2025-03-28 17:38:32 +01:00

1.3 KiB

#meta Implements useful embeds

Youtube

Example

${embed.youtube "https://youtu.be/t1oy_41bDAY?si=X76FvJEUlJnApwEg"}

Implementation

-- Schema
local youtubeSpecSchema = {
  type = "object",
  properties = {
    url = { type = "string"},
    width = { type = "number"},
    height = { type = "number"},
  },
  required = {"url"}
}

-- Youtube widget
function embed.youtube(specOrUrl)
  if type(specOrUrl) == "string" then
    specOrUrl = { url = specOrUrl }
  end
  -- Validate spec
  local validationResult = jsonschema.validateObject(youtubeSpecSchema, specOrUrl)
  if validationResult then
    error(validationResult)
  end
  local videoId = string.match(specOrUrl.url, "youtube%.com/watch%?v=(.+)")
  if not videoId then
    videoId = string.match(specOrUrl.url, "youtu%.be/(.+)")
  end

  if not videoId then
    error("No video id found")
  end
  
  local width = specOrUrl.width or "100%"
  local height = specOrUrl.height or "400px"
  return widget.new {
    html = "<iframe src='https://www.youtube.com/embed/"
      .. videoId
      .. "' style='width: " .. width
      .. "; height: " .. height .. "'></iframe>",
    cssClasses = {"sb-youtube-embed"}
  }
end

Styling

.sb-youtube-embed {
  border: 0;
}

General implementation

-- priority: 50
embed = {}