123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- /**
- * @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 PointLike
- * @property {number | null | undefined} [line]
- * @property {number | null | undefined} [column]
- * @property {number | null | undefined} [offset]
- *
- * @typedef PositionLike
- * @property {PointLike | null | undefined} [start]
- * @property {PointLike | null | undefined} [end]
- */
- /**
- * Serialize the positional info of a point, position (start and end points),
- * or node.
- *
- * @param {Node | NodeLike | Point | PointLike | Position | PositionLike | 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
- }
|