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 | import Crowi from '../Crowi' export default class Tsv2Table { option: { header?: boolean } constructor(crowi: Crowi, option = {}) { if (!option) { option = {} } this.option = option this.option.header = this.option.header || false } splitColums(line: string) { // \t is replaced to ' ' by Lexer.lex(), so split by 4 spaces return line.split(/\s{4}/g) } getTableHeader(codeLines: string[]) { let headers: string[] = [] const headLine = codeLines[0] || '' // console.log('head', headLine); headers = this.splitColums(headLine).map(col => { return `<th>${Crowi.escape(col)}</th>` }) return `<tr> ${headers.join('\n')} </tr>` } getTableBody(codeLines: string[]) { if (this.option.header) { codeLines.shift() } const rows = codeLines.map(row => { const cols = this.splitColums(row) .map(col => { return `<td>${Crowi.escape(col)}</td>` }) .join('') return `<tr>${cols}</tr>` }) return rows.join('\n') } process(code: string) { const codeLines: string[] = code.split(/\n|\r/) let header = '' if (this.option.header) { header = `<thead> ${this.getTableHeader(codeLines)} </thead>` } return `<table> ${header} <tbody> ${this.getTableBody(codeLines)} </tbody> </table>` } } |