# core/parsers/word.parser.ts

> 35 lines of code and 8 definitions.

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

Listed in [core/parsers](https://banes-lab.com/api/source/quality/core/parsers.md), after [core/parsers/tool.yamllint.parser.ts](https://banes-lab.com/source/quality/core/parsers/tool.yamllint.parser.ts.md).

## Definitions

- `tokenizeWords` (lexical_declaration, line 17, exported)
- `isAlnum` (lexical_declaration, line 6)
- `isBoundary` (lexical_declaration, line 10)
- `labelOfRule` (lexical_declaration, line 35, exported)
- `SEP` (lexical_declaration, line 3)
- `QUALIFIED_MARKER` (lexical_declaration, line 4)
- `marked` (lexical_declaration, line 18, exported)
- `prev` (lexical_declaration, line 19, exported)

## Contained in

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

## Used by

- [core/classifiers/concern.classifier.ts](https://banes-lab.com/source/quality/core/classifiers/concern.classifier.ts.md)

## Linked from

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

## Source

```typescript
import { isAlpha, isDigit, isLowerAlpha, isUpperAlpha } from "@govlab/constants";

const SEP = " ";
const QUALIFIED_MARKER = "puppycrawl";

const isAlnum = function isAlnum(ch: string): boolean {
    return isAlpha(ch) || isDigit(ch);
};

const isBoundary = function isBoundary(prev: string, ch: string): boolean {
    if (prev === "") {
        return false;
    }
    return (isLowerAlpha(prev) && isUpperAlpha(ch)) || isDigit(prev) !== isDigit(ch);
};

export const tokenizeWords = function tokenizeWords(value: string): string[] {
    let marked = "";
    let prev = "";
    for (const ch of value) {
        if (!isAlnum(ch)) {
            marked += SEP;
            prev = "";
            continue;
        }
        marked += isBoundary(prev, ch) ? SEP + ch : ch;
        prev = ch;
    }
    return marked
        .split(SEP)
        .filter(Boolean)
        .map((word) => word.toLowerCase());
};

export const labelOfRule = function labelOfRule(name: string): string {
    if (name.includes(".") && name.includes(QUALIFIED_MARKER)) {
        return name.slice(name.lastIndexOf(".") + 1).trim();
    }
    return name.trim();
};
```
