12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 |
- /**
- * @typedef {import('../types.js').CreateTracker} CreateTracker
- * @typedef {import('../types.js').TrackCurrent} TrackCurrent
- * @typedef {import('../types.js').TrackMove} TrackMove
- * @typedef {import('../types.js').TrackShift} TrackShift
- */
- /**
- * Track positional info in the output.
- *
- * @type {CreateTracker}
- */
- export function track(config) {
- // Defaults are used to prevent crashes when older utilities somehow activate
- // this code.
- /* c8 ignore next 5 */
- const options = config || {}
- const now = options.now || {}
- let lineShift = options.lineShift || 0
- let line = now.line || 1
- let column = now.column || 1
- return {move, current, shift}
- /**
- * Get the current tracked info.
- *
- * @type {TrackCurrent}
- */
- function current() {
- return {now: {line, column}, lineShift}
- }
- /**
- * Define an increased line shift (the typical indent for lines).
- *
- * @type {TrackShift}
- */
- function shift(value) {
- lineShift += value
- }
- /**
- * Move past some generated markdown.
- *
- * @type {TrackMove}
- */
- function move(input) {
- // eslint-disable-next-line unicorn/prefer-default-parameters
- const value = input || ''
- const chunks = value.split(/\r?\n|\r/g)
- const tail = chunks[chunks.length - 1]
- line += chunks.length - 1
- column =
- chunks.length === 1 ? column + tail.length : 1 + tail.length + lineShift
- return value
- }
- }
|