@@ -44,6 +44,7 @@ export const parser = (html: string, options: Options = {}): Node[] => {
4444 const locationTracker = new LocationTracker ( html ) ;
4545 const bufArray : Node [ ] = [ ] ;
4646 const results : Node [ ] = [ ] ;
47+ let lastOpenTagEndIndex = 0 ;
4748
4849 function bufferArrayLast ( ) : Node {
4950 return bufArray [ bufArray . length - 1 ] ;
@@ -122,14 +123,14 @@ export const parser = (html: string, options: Options = {}): Node[] => {
122123 }
123124
124125 function onopentag ( tag : string , attrs : Attributes ) {
125- const start = locationTracker . getPosition ( parser . startIndex ) ;
126126 const buf : NodeTag = { tag } ;
127127
128128 if ( options . sourceLocations ) {
129129 buf . location = {
130- start,
131- end : start
130+ start : locationTracker . getPosition ( parser . startIndex ) ,
131+ end : locationTracker . getPosition ( parser . endIndex )
132132 } ;
133+ lastOpenTagEndIndex = parser . endIndex ;
133134 }
134135
135136 if ( Object . keys ( attrs ) . length > 0 ) {
@@ -139,11 +140,15 @@ export const parser = (html: string, options: Options = {}): Node[] => {
139140 bufArray . push ( buf ) ;
140141 }
141142
142- function onclosetag ( ) {
143+ function onclosetag ( name : string , isImplied : boolean ) {
143144 const buf : Node | undefined = bufArray . pop ( ) ;
144145
145146 if ( buf && typeof buf === 'object' && buf . location && parser . endIndex !== null ) {
146- buf . location . end = locationTracker . getPosition ( parser . endIndex ) ;
147+ if ( ! isImplied ) {
148+ buf . location . end = locationTracker . getPosition ( parser . endIndex ) ;
149+ } else if ( lastOpenTagEndIndex < parser . startIndex ) {
150+ buf . location . end = locationTracker . getPosition ( parser . startIndex - 1 ) ;
151+ }
147152 }
148153
149154 if ( buf ) {
0 commit comments