mh-two-thousand-and-two
2024-04-12 7fc6dbf547b8899d949b67cdec36b96a7d1701c7
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
var range = 2
 
function generateCodeFrame (
  source,
  start,
  end
) {
  source = source.replace(/\r\n/g, '\n') // 替换\r\n 为 \n
  /* eslint-disable no-void */
  if (start === void 0) start = 0
  if (end === void 0) end = source.length
 
  var lines = source.split(/\n/) // 替换\r?\n 为 \n,不然 length 对不上,导致死循环
  var count = 0
  var res = []
  for (var i = 0; i < lines.length; i++) {
    count += lines[i].length + 1
    if (count >= start) {
      for (var j = i - range; j <= i + range || end > count; j++) {
        if (j < 0 || j >= lines.length) {
          continue
        }
        res.push(('' + (j + 1) + (repeat$1(' ', 3 - String(j + 1).length)) + '|  ' + (lines[j])))
        var lineLength = lines[j].length
        if (j === i) {
          // push underline
          var pad = start - (count - lineLength) + 1
          var length = end > count ? lineLength - pad : end - start
          res.push('   |  ' + repeat$1(' ', pad) + repeat$1('^', length))
        } else if (j > i) {
          if (end > count) {
            var length$1 = Math.min(end - count, lineLength)
            res.push('   |  ' + repeat$1('^', length$1))
          }
          count += lineLength + 1
        }
      }
      break
    }
  }
  return res.join('\n')
}
 
function repeat$1 (str, n) {
  var result = ''
  if (n > 0) {
        while (true) { // eslint-disable-line
      if (n & 1) {
        result += str
      }
      n >>>= 1
      if (n <= 0) {
        break
      }
      str += str
    }
  }
  return result
}
 
module.exports = generateCodeFrame