All files / src/elements Document.ts

82.6% Statements 19/23
80% Branches 16/20
100% Functions 4/4
82.6% Lines 19/23

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                                                64x 62x         32x 30x 2x     2x           88x 3x 6x 6x                   85x 27x       58x 32x 32x 4x 28x 2x   26x            
//e.g., 
// {
//     Text: [
//       'This is a test',
//       { Text: [Array] },
//       { Text: [Array] },
//       { Text: [Array] }
//     ]
//   }
 
 
export type Text = string | { Text: string[] } | Array<string | { Text: string[] }>
 
export interface DocumentConstructor {
    Text?: Array<string | { Text: string[] }> | string | { Text: string[] }
}
 
// documents contain text and templates
// ignore templates
// just select the text for rendering
export default class Document {
    public Text?: Array<string | { Text: string[] }> | string
 
    constructor(opts: DocumentConstructor) {        
        if (opts.Text) {
            this.Text = this.parseTextTag(opts.Text)
        }
    }
 
    public toString(): string {
        if (typeof this.Text === 'string') {
            return this.Text
        I} else if (this.Text) {
            return this.Text.join('').replace(/^[ \t]+/gm, '')
        } else {
            return ''
        }
    }
 
    private parseTextTag(text: Text): string {
        // if text is an array
        if (Array.isArray(text)) {
            return text.map((t) => {
                if (typeof t === 'string') {
                    return t.replace(/^[ \t]+/gm, '').concat('\n')
                E} else if (Array.isArray(t.Text)) {
                    return t.Text.join('').replace(/^[ \t]+/gm, '')
                } else {
                    return ''
                }
            }).join('')
        }
 
        // if text is a string
        if (typeof text === 'string') {
            return text
        }
 
        // if text is an object
        if (typeof text === 'object') {
            const inner = text.Text as string|string[]|Text
            if (Array.isArray(inner)) {
                return inner.join('').replace(/^[ \t]+/gm, '')
            } else if (typeof inner === 'string') {
                return inner
            } else {
                return this.parseTextTag(inner)
            }
        }
    }
 
}