digitalheir/bibtex-js

View on GitHub
src/bibfile/datatype/string/BibStringComponent.ts

Summary

Maintainability
A
50 mins
Test Coverage
import {BibStringData, BibStringDatum} from "./BibStringData";
import {isNumber, isString} from "../../../util";

/**
 * A fully formed string (between {braces} or "quotes").
 * Consists of 0 or many BibStringDatum
 */
export class BibStringComponent {
    readonly data: BibStringData;
    readonly type: string;

    /**
     * The brace depth of an item is the number of braces surrounding it (surrounding the field with braces instead of quotes does not modify the brace depth)
     */
    readonly braceDepth: number;

    constructor(type: string, braceDepth: number, data: BibStringData) {
        this.type = type;
        this.braceDepth = braceDepth;
        this.data = data;
    }


    stringify(): string {
        return this.data.map(stringifyDatum).join("");
    }
}

function isBibStringComponent(x: any): x is BibStringComponent {
    return typeof x.braceDepth === "number" && typeof x.type === "string";
}

export function stringifyDatum(datum: BibStringDatum): string {
    if (isString(datum)) return datum;
    if (isNumber(datum)) return datum.toString();
    if (isBibStringComponent(datum)) return datum.stringify();
    // if (isStringRef(datum)) throw new Error("Unexpected state");
    else throw new Error("Unexpected state");
}

export class BibOuterStringComponent extends BibStringComponent {
    constructor(type: string, data: BibStringData) {
        super(type, 0, data);
    }
}