(parser)
| 26779 | } |
| 26780 | |
| 26781 | function closeTag (parser) { |
| 26782 | if (!parser.tagName) { |
| 26783 | strictFail(parser, 'Weird empty close tag.') |
| 26784 | parser.textNode += '</>' |
| 26785 | parser.state = S.TEXT |
| 26786 | return |
| 26787 | } |
| 26788 | |
| 26789 | if (parser.script) { |
| 26790 | if (parser.tagName !== 'script') { |
| 26791 | parser.script += '</' + parser.tagName + '>' |
| 26792 | parser.tagName = '' |
| 26793 | parser.state = S.SCRIPT |
| 26794 | return |
| 26795 | } |
| 26796 | emitNode(parser, 'onscript', parser.script) |
| 26797 | parser.script = '' |
| 26798 | } |
| 26799 | |
| 26800 | // first make sure that the closing tag actually exists. |
| 26801 | // <a><b></c></b></a> will close everything, otherwise. |
| 26802 | var t = parser.tags.length |
| 26803 | var tagName = parser.tagName |
| 26804 | if (!parser.strict) { |
| 26805 | tagName = tagName[parser.looseCase]() |
| 26806 | } |
| 26807 | var closeTo = tagName |
| 26808 | while (t--) { |
| 26809 | var close = parser.tags[t] |
| 26810 | if (close.name !== closeTo) { |
| 26811 | // fail the first time in strict mode |
| 26812 | strictFail(parser, 'Unexpected close tag') |
| 26813 | } else { |
| 26814 | break |
| 26815 | } |
| 26816 | } |
| 26817 | |
| 26818 | // didn't find it. we already failed for strict, so just abort. |
| 26819 | if (t < 0) { |
| 26820 | strictFail(parser, 'Unmatched closing tag: ' + parser.tagName) |
| 26821 | parser.textNode += '</' + parser.tagName + '>' |
| 26822 | parser.state = S.TEXT |
| 26823 | return |
| 26824 | } |
| 26825 | parser.tagName = tagName |
| 26826 | var s = parser.tags.length |
| 26827 | while (s-- > t) { |
| 26828 | var tag = parser.tag = parser.tags.pop() |
| 26829 | parser.tagName = parser.tag.name |
| 26830 | emitNode(parser, 'onclosetag', parser.tagName) |
| 26831 | |
| 26832 | var x = {} |
| 26833 | for (var i in tag.ns) { |
| 26834 | x[i] = tag.ns[i] |
| 26835 | } |
| 26836 | |
| 26837 | var parent = parser.tags[parser.tags.length - 1] || parser |
| 26838 | if (parser.opt.xmlns && tag.ns !== parent.ns) { |
no test coverage detected