All files rule.ts

100% Statements 25/25
100% Branches 9/9
100% Functions 3/3
100% Lines 24/24

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80                1x   1x     1x 11x             1x 19x 19x       49x 8x           49x     2x           2x   2x 1x     2x 2x   2x         2x   7x         7x   1x         1x   1x 1x          
import { MarkdownIt } from "markdown-it";
import { Token, Tokens } from "./index";
 
export interface State {
    tokens: Token[];
    Token: (type: string, tag?: string, idx?: number) => void;
}
 
export default class CreateRule {
    constructor(md: MarkdownIt) {
        return this.replace as any;
    }
 
    public replace = (state: State): void => {
        this.renderComponents(state);
    };
 
    /**
     * Renders custom JSX components in place of HTML
     * generated from the markdown-it package
     */
    private renderComponents = (state: State): void => {
        for (
            let i: number = 0, tokenLength: number = state.tokens.length;
            i < tokenLength;
            i++
        ) {
            if (state.tokens[i].children) {
                this.renderComponents({
                    Token: state.Token,
                    tokens: state.tokens[i].children,
                });
            }
 
            switch (state.tokens[i].type) {
                case "link_open":
                    /* eslint-disable-next-line no-case-declarations */
                    const linkToken: Token = new state.Token(
                        state.tokens[i].type,
                        "Hypertext",
                        1
                    );
 
                    linkToken.attrPush(["href", state.tokens[i].attrs[0][1]]);
 
                    if (state.tokens[i].attrs[0][1].substr(0, 4) === "http") {
                        linkToken.attrPush(["target", "_blank"]);
                    }
 
                    state.tokens[i] = linkToken;
                    break;
                case "link_close":
                    state.tokens[i] = new state.Token(
                        state.tokens[i].type,
                        "Hypertext",
                        -1
                    );
                    break;
                case "paragraph_close":
                    state.tokens[i] = new state.Token(
                        state.tokens[i].type,
                        "Typography",
                        -1
                    );
                    break;
                case "heading_close":
                    state.tokens[i] = new state.Token(
                        state.tokens[i].type,
                        "Heading",
                        -1
                    );
                    break;
                case "hr":
                    state.tokens[i] = new state.Token(state.tokens[i].type, "Divider", 0);
                    break;
            }
        }
    };
}