Skip to content

Commit 86168d2

Browse files
committed
Add support for <video>, <audio>
Closes GH-16.
1 parent 57b0d05 commit 86168d2

File tree

10 files changed

+175
-6
lines changed

10 files changed

+175
-6
lines changed

lib/handlers/index.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ var inlineCode = require('./inline-code')
1717
var link = require('./link')
1818
var list = require('./list')
1919
var listItem = require('./list-item')
20+
var media = require('./media')
2021
var paragraph = require('./paragraph')
2122
var quote = require('./q')
2223
var root = require('./root')
@@ -107,6 +108,7 @@ exports.picture = wrapped
107108
exports.section = wrapped
108109

109110
exports.a = link
111+
exports.audio = media
110112
exports.b = strong
111113
exports.base = base
112114
exports.blockquote = blockquote
@@ -150,6 +152,7 @@ exports.tt = inlineCode
150152
exports.u = emphasis
151153
exports.ul = list
152154
exports.var = inlineCode
155+
exports.video = media
153156
exports.wbr = wbr
154157
exports.xmp = code
155158

lib/handlers/media.js

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
'use strict'
2+
3+
module.exports = media
4+
5+
var visit = require('unist-util-visit')
6+
var is = require('hast-util-is-element')
7+
var toString = require('mdast-util-to-string')
8+
var all = require('../all')
9+
var resolve = require('../util/resolve')
10+
var needed = require('../util/wrap').needed
11+
12+
function media(h, node) {
13+
var nodes = all(h, node)
14+
var poster = is(node, 'video') ? node.properties.poster : null
15+
var src = node.properties.src
16+
var children = node.children
17+
var length = children.length
18+
var index = -1
19+
var linkInFallbackContent = false
20+
var child
21+
22+
// Find the source.
23+
while (!src && ++index < length) {
24+
child = children[index]
25+
26+
if (is(child, 'source')) {
27+
src = child.properties.src
28+
}
29+
}
30+
31+
visit({type: 'root', children: nodes}, 'link', findLink)
32+
33+
/* If the content links to something, or if it’s not phrasing... */
34+
if (linkInFallbackContent || needed(nodes)) {
35+
return nodes
36+
}
37+
38+
// If there’s a poster defined on the video, create an image.
39+
if (poster) {
40+
nodes = [
41+
{
42+
type: 'image',
43+
title: null,
44+
url: resolve(h, poster),
45+
alt: toString({children: nodes})
46+
}
47+
]
48+
}
49+
50+
// Link to the media resource.
51+
return {
52+
type: 'link',
53+
title: null,
54+
url: resolve(h, src),
55+
children: nodes
56+
}
57+
58+
function findLink() {
59+
linkInFallbackContent = true
60+
return visit.EXIT
61+
}
62+
}

lib/handlers/table.js

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,17 +24,12 @@ function alignment(node) {
2424
if (cell(child)) {
2525
pos = cellsBefore(parent, child)
2626
if (!align[pos]) {
27-
align[pos] = infer(child) || null
27+
align[pos] = child.properties.align || null
2828
}
2929
}
3030
}
3131
}
3232

33-
/* Get the alignment of a cell. */
34-
function infer(node) {
35-
return node.properties.align
36-
}
37-
3833
/* Count cells in `parent` before `node`. */
3934
function cellsBefore(parent, node) {
4035
var children = parent.children

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
"hast-util-is-element": "^1.0.0",
2828
"hast-util-to-string": "^1.0.0",
2929
"mdast-util-phrasing": "^1.0.0",
30+
"mdast-util-to-string": "^1.0.4",
3031
"rehype-minify-whitespace": "^2.0.3",
3132
"trim-trailing-lines": "^1.1.0",
3233
"unist-util-visit": "^1.1.1",

test/fixtures/audio/index.html

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
<p><audio src=example.ogg autoplay>Alpha</audio></p>
2+
3+
<p><audio src=example.ogg>Bravo <code>code</code> <em>emphasis</em>.</audio></p>
4+
5+
<p>
6+
<audio>
7+
Charlie
8+
<source src=example.wav type=audio/wav>
9+
</audio>
10+
</p>
11+
12+
<p>
13+
<audio>
14+
<source src=example.opus type="audio/ogg; codecs=opus">
15+
<source src=example.ogg type="audio/ogg; codecs=vorbis">
16+
<source src=example.mp3 type=audio/mpeg>
17+
Delta
18+
</audio>
19+
</p>
20+
21+
<audio src=example.ogg>
22+
<p><a href=example.ogg>Echo</a>.</p>
23+
</audio>
24+
25+
<audio>
26+
<source src=example.opus type="audio/ogg; codecs=opus">
27+
<track kind=subtitles src=example.en.vtt srclang=en label=English>
28+
<p><a href=example.ogg>Foxtrot</a>.</p>
29+
</audio>

test/fixtures/audio/index.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"fragment": true
3+
}

test/fixtures/audio/index.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
[Alpha](example.ogg)
2+
3+
[Bravo `code` _emphasis_.](example.ogg)
4+
5+
[Charlie](example.wav)
6+
7+
[Delta](example.opus)
8+
9+
[Echo](example.ogg).
10+
11+
[Foxtrot](example.ogg).

test/fixtures/video/index.html

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
<p><video src=example.ogv autoplay>Alpha</video></p>
2+
3+
<p><video src=example.ogv poster=example.png>Bravo <code>code</code> <em>emphasis</em>.</video></p>
4+
5+
<p>
6+
<video>
7+
Charlie
8+
<source src=example.wav type=video/wav>
9+
</video>
10+
</p>
11+
12+
<p>
13+
<video poster=example.png>
14+
<source src=example.wav type=video/wav>
15+
Delta
16+
</video>
17+
</p>
18+
19+
<p>
20+
<video>
21+
<source src=example.ogv type='video/ogg; codecs="theora, speex"'>
22+
<source src=example.mp4 type='video/mp4; codecs="avc1.42E01E, mp4a.40.2"'>
23+
Echo
24+
</video>
25+
</p>
26+
27+
<video src=example.ogv>
28+
<p><a href=example.ogv>Foxtrot</a>.</p>
29+
</video>
30+
31+
<video src=example.ogv poster=example.png>
32+
<p><a href=example.ogv>Golf</a>.</p>
33+
</video>
34+
35+
<video>
36+
<source src=example.ogv type='video/ogg; codecs="theora, speex"'>
37+
<track kind=subtitles src=example.en.vtt srclang=en label=English>
38+
<p><a href=example.ogv>Hotel</a>.</p>
39+
</video>
40+
41+
<video poster=example.png>
42+
<source src=example.ogv type='video/ogg; codecs="theora, speex"'>
43+
<track kind=subtitles src=example.en.vtt srclang=en label=English>
44+
<p><a href=example.ogv>India</a>.</p>
45+
</video>

test/fixtures/video/index.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"fragment": true
3+
}

test/fixtures/video/index.md

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
[Alpha](example.ogv)
2+
3+
[![Bravo code emphasis.](example.png)](example.ogv)
4+
5+
[Charlie](example.wav)
6+
7+
[![Delta](example.png)](example.wav)
8+
9+
[Echo](example.ogv)
10+
11+
[Foxtrot](example.ogv).
12+
13+
[Golf](example.ogv).
14+
15+
[Hotel](example.ogv).
16+
17+
[India](example.ogv).

0 commit comments

Comments
 (0)