58 lines
		
	
	
	
		
			1.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			58 lines
		
	
	
	
		
			1.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
/**
 | 
						|
 * @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
 | 
						|
  }
 | 
						|
}
 |