diff --git a/lib/html5/parser.js b/lib/html5/parser.js
index 4f380bf7..e7113ff5 100644
--- a/lib/html5/parser.js
+++ b/lib/html5/parser.js
@@ -1839,8 +1839,10 @@ var Parser = HTML5.Parser = function HTML5Parser(options) {
optgroup: 'startTagOptionOptgroup',
math: 'startTagMath',
svg: 'startTagSVG',
- rt: 'startTagRpRt',
- rp: 'startTagRpRt',
+ rt: 'startTagRpRtRbRtc',
+ rp: 'startTagRpRtRbRtc',
+ rb: 'startTagRpRtRbRtc',
+ rtc: 'startTagRpRtRbRtc',
"-default": 'startTagOther'
};
@@ -2003,9 +2005,14 @@ var Parser = HTML5.Parser = function HTML5Parser(options) {
}
};
- phases.inBody.startTagRpRt = function(name, attributes) {
+ phases.inBody.startTagRpRtRbRtc = function(name, attributes) {
if (this.inScope('ruby')) {
- tree.generateImpliedEndTags();
+ if (name === 'rt') {
+ tree.generateImpliedEndTags('rtc');
+ }
+ else {
+ tree.generateImpliedEndTags();
+ }
if (tree.open_elements.last().tagName.toLowerCase() != 'ruby') {
parser.parse_error('unexpected-start-tag', {name: name});
}
@@ -2344,7 +2351,7 @@ var Parser = HTML5.Parser = function HTML5Parser(options) {
}
/// @todo Emit parse error on end tags other than the ones listed in http://www.w3.org/TR/html5/tree-construction.html#parsing-main-inbody
- // ['dd', 'dt', 'li', 'optgroup', 'option', 'p', 'rp', 'rt', 'tbody', 'td', 'tfoot', 'th', 'thead', 'tr', 'body', 'html']
+ // ['dd', 'dt', 'li', 'optgroup', 'option', 'p', 'rp', 'rt', 'rb', 'rtc', 'tbody', 'td', 'tfoot', 'th', 'thead', 'tr', 'body', 'html']
if (tree.open_elements.last().tagName.toLowerCase() != 'body') {
parser.parse_error('expected-one-end-tag-but-got-another', {
expectedName: tree.open_elements.last().tagName.toLowerCase(),
@@ -2361,7 +2368,7 @@ var Parser = HTML5.Parser = function HTML5Parser(options) {
}
/// @todo Emit parse error on end tags other than the ones listed in http://www.w3.org/TR/html5/tree-construction.html#parsing-main-inbody
- // ['dd', 'dt', 'li', 'optgroup', 'option', 'p', 'rp', 'rt', 'tbody', 'td', 'tfoot', 'th', 'thead', 'tr', 'body', 'html']
+ // ['dd', 'dt', 'li', 'optgroup', 'option', 'p', 'rp', 'rt', 'rb', 'rtc', 'tbody', 'td', 'tfoot', 'th', 'thead', 'tr', 'body', 'html']
if (tree.open_elements.last().tagName.toLowerCase() != 'body') {
parser.parse_error('expected-one-end-tag-but-got-another', {
expectedName: tree.open_elements.last().tagName.toLowerCase(),
diff --git a/lib/html5/treebuilder.js b/lib/html5/treebuilder.js
index 53164096..d8241979 100644
--- a/lib/html5/treebuilder.js
+++ b/lib/html5/treebuilder.js
@@ -245,7 +245,7 @@ b.prototype.generateImpliedEndTags = function(exclude) {
return
}
var name = this.open_elements.last().tagName.toLowerCase();
- if(['dd', 'dt', 'li', 'option', 'optgroup', 'p', 'rp', 'rt'].indexOf(name) != -1 && name != exclude) {
+ if(['dd', 'dt', 'li', 'option', 'optgroup', 'p', 'rp', 'rt', 'rb', 'rtc'].indexOf(name) != -1 && name != exclude) {
var p = this.pop_element();
this.generateImpliedEndTags(exclude);
}