/** | |
* @typedef {import('unist').Node} Node | |
* @typedef {import('unist').Point} Point | |
* @typedef {import('unist').Position} Position | |
*/ | |
/** | |
* @typedef NodeLike | |
* @property {string} type | |
* @property {PositionLike | null | undefined} [position] | |
* | |
* @typedef PositionLike | |
* @property {PointLike | null | undefined} [start] | |
* @property {PointLike | null | undefined} [end] | |
* | |
* @typedef PointLike | |
* @property {number | null | undefined} [line] | |
* @property {number | null | undefined} [column] | |
* @property {number | null | undefined} [offset] | |
*/ | |
/** | |
* Serialize the positional info of a point, position (start and end points), | |
* or node. | |
* | |
* @param {Node | NodeLike | Position | PositionLike | Point | PointLike | null | undefined} [value] | |
* Node, position, or point. | |
* @returns {string} | |
* Pretty printed positional info of a node (`string`). | |
* | |
* In the format of a range `ls:cs-le:ce` (when given `node` or `position`) | |
* or a point `l:c` (when given `point`), where `l` stands for line, `c` for | |
* column, `s` for `start`, and `e` for end. | |
* An empty string (`''`) is returned if the given value is neither `node`, | |
* `position`, nor `point`. | |
*/ | |
export function stringifyPosition(value) { | |
// Nothing. | |
if (!value || typeof value !== 'object') { | |
return '' | |
} | |
// Node. | |
if ('position' in value || 'type' in value) { | |
return position(value.position) | |
} | |
// Position. | |
if ('start' in value || 'end' in value) { | |
return position(value) | |
} | |
// Point. | |
if ('line' in value || 'column' in value) { | |
return point(value) | |
} | |
// ? | |
return '' | |
} | |
/** | |
* @param {Point | PointLike | null | undefined} point | |
* @returns {string} | |
*/ | |
function point(point) { | |
return index(point && point.line) + ':' + index(point && point.column) | |
} | |
/** | |
* @param {Position | PositionLike | null | undefined} pos | |
* @returns {string} | |
*/ | |
function position(pos) { | |
return point(pos && pos.start) + '-' + point(pos && pos.end) | |
} | |
/** | |
* @param {number | null | undefined} value | |
* @returns {number} | |
*/ | |
function index(value) { | |
return value && typeof value === 'number' ? value : 1 | |
} | |