isaacs / sax-js

A sax style parser for JS
Other
1.09k stars 325 forks source link

The startTagLine and startTagColumn members would be useful #228

Closed ghost closed 4 years ago

ghost commented 6 years ago

test.js:

var sax = require('../lib/sax')
var tap = require('tap')

function testPosition (chunks, expectedEvents) {
  var parser = sax.parser()
  expectedEvents.forEach(function (expectation) {
    parser['on' + expectation[0]] = function () {
      for (var prop in expectation[1]) {
        tap.equal(parser[prop], expectation[1][prop])
      }
    }
  })
  chunks.forEach(function (chunk) {
    parser.write(chunk)
  })
}

testPosition(['<div>abcdefgh</div>'], [
  [ 'opentagstart', { position: 5, startTagPosition: 1, startTagLine: 1, startTagColumn: 2 } ],
  [ 'opentag', { position: 5, startTagPosition: 1, startTagLine: 1, startTagColumn: 2 } ],
  [ 'text', { position: 19, startTagPosition: 14, startTagLine: 1, startTagColumn: 15 } ],
  [ 'closetag', { position: 19, startTagPosition: 14, startTagLine: 1, startTagColumn: 15 } ]
])

testPosition(['<div>abcde', 'fg\nh</div>'], [
  ['opentagstart', { position: 5, startTagPosition: 1, startTagLine: 1, startTagColumn: 2 }],
  ['opentag', { position: 5, startTagPosition: 1, startTagLine: 1, startTagColumn: 2 }],
  ['text', { position: 20, startTagPosition: 15, startTagLine: 2, startTagColumn: 3 }],
  ['closetag', { position: 20, startTagPosition: 15, startTagLine: 2, startTagColumn: 3 }]
])
diff --git a/lib/sax.js b/lib/sax.js
index 795d607..c47d68d 100644
--- a/lib/sax.js
+++ b/lib/sax.js
@@ -945,6 +945,8 @@
     if (c === '<') {
       parser.state = S.OPEN_WAKA
       parser.startTagPosition = parser.position
+      parser.startTagLine = parser.line + 1
+      parser.startTagColumn = parser.column + 1
     } else if (!isWhitespace(c)) {
       // have to process this as a text node.
       // weird, but happens.
@@ -1030,6 +1032,8 @@
           if (c === '<' && !(parser.sawRoot && parser.closedRoot && !parser.strict)) {
             parser.state = S.OPEN_WAKA
             parser.startTagPosition = parser.position
+          parser.startTagLine = parser.line + 1
+          parser.startTagColumn = parser.column + 1
           } else {
             if (!isWhitespace(c) && (!parser.sawRoot || parser.closedRoot)) {
               strictFail(parser, 'Text data outside of root node.')