feat: support youtube playlist iframe (#968)
* feat: support youtube playlist iframe
* chore: updated Youtube embed documentation to include playlists
| | |
| | | - `parseArrows`: If `true` (default), transforms arrow symbols into their HTML character equivalents. |
| | | - `parseBlockReferences`: If `true` (default), handles block references, linking to specific content blocks. |
| | | - `enableInHtmlEmbed`: If `true`, allows embedding of content directly within HTML. Defaults to `false`. |
| | | - `enableYouTubeEmbed`: If `true` (default), enables the embedding of YouTube videos using external image Markdown syntax. |
| | | - `enableYouTubeEmbed`: If `true` (default), enables the embedding of YouTube videos and playlists using external image Markdown syntax. |
| | | - `enableVideoEmbed`: If `true` (default), enables the embedding of video files. |
| | | - `enableCheckbox`: If `true`, adds support for interactive checkboxes in content. Defaults to `false`. |
| | | |
| | |
| | | ) |
| | | const blockReferenceRegex = new RegExp(/\^([-_A-Za-z0-9]+)$/, "g") |
| | | const ytLinkRegex = /^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=)([^#\&\?]*).*/ |
| | | const ytPlaylistLinkRegex = /[?&]list=([^#?&]*)/ |
| | | const videoExtensionRegex = new RegExp(/\.(mp4|webm|ogg|avi|mov|flv|wmv|mkv|mpg|mpeg|3gp|m4v)$/) |
| | | const wikilinkImageEmbedRegex = new RegExp( |
| | | /^(?<alt>(?!^\d*x?\d*$).*?)?(\|?\s*?(?<width>\d+)(x(?<height>\d+))?)?$/, |
| | |
| | | if (node.tagName === "img" && typeof node.properties.src === "string") { |
| | | const match = node.properties.src.match(ytLinkRegex) |
| | | const videoId = match && match[2].length == 11 ? match[2] : null |
| | | const playlistId = node.properties.src.match(ytPlaylistLinkRegex)?.[1] |
| | | if (videoId) { |
| | | // YouTube video (with optional playlist) |
| | | node.tagName = "iframe" |
| | | node.properties = { |
| | | class: "external-embed", |
| | |
| | | frameborder: 0, |
| | | width: "600px", |
| | | height: "350px", |
| | | src: `https://www.youtube.com/embed/${videoId}`, |
| | | src: playlistId |
| | | ? `https://www.youtube.com/embed/${videoId}?list=${playlistId}` |
| | | : `https://www.youtube.com/embed/${videoId}`, |
| | | } |
| | | } else if (playlistId) { |
| | | // YouTube playlist only. |
| | | node.tagName = "iframe" |
| | | node.properties = { |
| | | class: "external-embed", |
| | | allow: "fullscreen", |
| | | frameborder: 0, |
| | | width: "600px", |
| | | height: "350px", |
| | | src: `https://www.youtube.com/embed/videoseries?list=${playlistId}`, |
| | | } |
| | | } |
| | | } |