# core/parsers/location.parser.ts

> 36 lines of code and 13 definitions.

Tree: GovLab Docs
Language: typescript
Layer: processing
Canonical: https://banes-lab.com/anatomy/docs#file-docs-core-parsers-location-parser-ts
Source text: https://banes-lab.com/source/docs/core/parsers/location.parser.ts.txt

Listed in [core/parsers](https://banes-lab.com/api/source/docs/core/parsers.md), after [core/parsers/layer.parser.ts](https://banes-lab.com/source/docs/core/parsers/layer.parser.ts.md) and before [core/parsers/markdown.parser.ts](https://banes-lab.com/source/docs/core/parsers/markdown.parser.ts.md).

## Definitions

- `pathReferences` (lexical_declaration, line 35, exported)
- `spansIn` (lexical_declaration, line 17)
- `looksLikePath` (lexical_declaration, line 10)
- `PATH_DISQUALIFIERS` (lexical_declaration, line 4)
- `PACKAGE_MARK` (lexical_declaration, line 5)
- `SEPARATOR` (lexical_declaration, line 6)
- `BACKTICK_SPAN` (lexical_declaration, line 7)
- `LINK_SPAN` (lexical_declaration, line 8)
- `refs` (lexical_declaration, line 18)
- `start` (lexical_declaration, line 19)
- `from` (lexical_declaration, line 21)
- `end` (lexical_declaration, line 22)
- `content` (lexical_declaration, line 26)

## Contained in

- [core/parsers](https://banes-lab.com/anatomy/docs/folder-docs-core-parsers.md)

## Uses

- [core/parsers/markdown.parser.ts](https://banes-lab.com/source/docs/core/parsers/markdown.parser.ts.md)

## Used by

- [core/analyzers/drift.analyzer.ts](https://banes-lab.com/source/docs/core/analyzers/drift.analyzer.ts.md)
- [core/analyzers/reference.analyzer.ts](https://banes-lab.com/source/docs/core/analyzers/reference.analyzer.ts.md)
- [core/validators/manifest.prose.validator.ts](https://banes-lab.com/source/docs/core/validators/manifest.prose.validator.ts.md)

## Linked from

- [core/analyzers](https://banes-lab.com/anatomy/docs/folder-docs-core-analyzers.md)
- [core/parsers](https://banes-lab.com/anatomy/docs/folder-docs-core-parsers.md)
- [core/validators](https://banes-lab.com/anatomy/docs/folder-docs-core-validators.md)

## Source

```typescript
import type { PathRef, SpanDelims } from "#types/reference.types";
import { proseLines } from "#core/parsers/markdown.parser";

const PATH_DISQUALIFIERS: readonly string[] = ["://", " ", "`", "*", "<", ">", "...", "[", "]", "\\", "{", "}"];
const PACKAGE_MARK = "@";
const SEPARATOR = "/";
const BACKTICK_SPAN: SpanDelims = { close: "`", open: "`" };
const LINK_SPAN: SpanDelims = { close: ")", open: "](" };

const looksLikePath = function looksLikePath(candidate: string): boolean {
    if (candidate.length === 0 || !candidate.includes(SEPARATOR) || candidate.startsWith(PACKAGE_MARK)) {
        return false;
    }
    return !PATH_DISQUALIFIERS.some((bad) => candidate.includes(bad));
};

const spansIn = function spansIn(line: string, lineNo: number, delims: SpanDelims): PathRef[] {
    const refs: PathRef[] = [];
    let start = line.indexOf(delims.open);
    while (start !== -1) {
        const from = start + delims.open.length;
        const end = line.indexOf(delims.close, from);
        if (end === -1) {
            return refs;
        }
        const content = line.slice(from, end);
        if (looksLikePath(content)) {
            refs.push({ col: from + 1, line: lineNo, path: content });
        }
        start = line.indexOf(delims.open, end + 1);
    }
    return refs;
};

export const pathReferences = function pathReferences(source: string): PathRef[] {
    return proseLines(source).flatMap(({ line, lineNo }) => [
        ...spansIn(line, lineNo, BACKTICK_SPAN),
        ...spansIn(line, lineNo, LINK_SPAN),
    ]);
};
```
