168 lines
3.2 KiB
JavaScript
168 lines
3.2 KiB
JavaScript
|
/*
|
||
|
* @Author: zoujie.wzj
|
||
|
* @Date: 2016-01-23 18:17:55
|
||
|
* @Last Modified by: Sahel LUCAS--SAOUDI
|
||
|
* @Last Modified on: 2021-11-12
|
||
|
*/
|
||
|
|
||
|
'use strict'
|
||
|
|
||
|
const cp = require('child_process')
|
||
|
|
||
|
const UNIT_MB = 1024 * 1024
|
||
|
|
||
|
const utils = {
|
||
|
/**
|
||
|
* exec command with maxBuffer size
|
||
|
*/
|
||
|
exec (cmd, callback) {
|
||
|
cp.exec(cmd, {
|
||
|
maxBuffer: 2 * UNIT_MB,
|
||
|
windowsHide: true
|
||
|
}, callback)
|
||
|
},
|
||
|
/**
|
||
|
* spawn command
|
||
|
*/
|
||
|
spawn (cmd, args, options) {
|
||
|
return cp.spawn(cmd, args, options)
|
||
|
},
|
||
|
/**
|
||
|
* Strip top lines of text
|
||
|
*
|
||
|
* @param {String} text
|
||
|
* @param {Number} num
|
||
|
* @return {String}
|
||
|
*/
|
||
|
stripLine (text, num) {
|
||
|
let idx = 0
|
||
|
|
||
|
while (num-- > 0) {
|
||
|
const nIdx = text.indexOf('\n', idx)
|
||
|
if (nIdx >= 0) {
|
||
|
idx = nIdx + 1
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return idx > 0 ? text.substring(idx) : text
|
||
|
},
|
||
|
|
||
|
/**
|
||
|
* Split string and stop at max parts
|
||
|
*
|
||
|
* @param {Number} line
|
||
|
* @param {Number} max
|
||
|
* @return {Array}
|
||
|
*/
|
||
|
split (line, max) {
|
||
|
const cols = line.trim().split(/\s+/)
|
||
|
|
||
|
if (cols.length > max) {
|
||
|
cols[max - 1] = cols.slice(max - 1).join(' ')
|
||
|
}
|
||
|
|
||
|
return cols
|
||
|
},
|
||
|
|
||
|
/**
|
||
|
* Extract columns from table text
|
||
|
*
|
||
|
* Example:
|
||
|
*
|
||
|
* ```
|
||
|
* extractColumns(text, [0, 2], 3)
|
||
|
* ```
|
||
|
*
|
||
|
* From:
|
||
|
* ```
|
||
|
* foo bar bar2
|
||
|
* valx valy valz
|
||
|
* ```
|
||
|
*
|
||
|
* To:
|
||
|
* ```
|
||
|
* [ ['foo', 'bar2'], ['valx', 'valz'] ]
|
||
|
* ```
|
||
|
*
|
||
|
* @param {String} text raw table text
|
||
|
* @param {Array} idxes the column index list to extract
|
||
|
* @param {Number} max max column number of table
|
||
|
* @return {Array}
|
||
|
*/
|
||
|
extractColumns (text, idxes, max) {
|
||
|
const lines = text.split(/(\r\n|\n|\r)/)
|
||
|
const columns = []
|
||
|
|
||
|
if (!max) {
|
||
|
max = Math.max.apply(null, idxes) + 1
|
||
|
}
|
||
|
|
||
|
lines.forEach(line => {
|
||
|
const cols = utils.split(line, max)
|
||
|
const column = []
|
||
|
|
||
|
idxes.forEach(idx => {
|
||
|
column.push(cols[idx] || '')
|
||
|
})
|
||
|
|
||
|
columns.push(column)
|
||
|
})
|
||
|
|
||
|
return columns
|
||
|
},
|
||
|
|
||
|
/**
|
||
|
* parse table text to array
|
||
|
*
|
||
|
* From:
|
||
|
* ```
|
||
|
* Header1 : foo
|
||
|
* Header2 : bar
|
||
|
* Header3 : val
|
||
|
*
|
||
|
* Header1 : foo2
|
||
|
* Header2 : bar2
|
||
|
* Header3 : val2
|
||
|
* ```
|
||
|
*
|
||
|
* To:
|
||
|
* ```
|
||
|
* [{ Header1: 'foo', Header2: 'bar', Header3: 'val' }, ...]
|
||
|
* ```
|
||
|
*
|
||
|
* @param {String} data raw table data
|
||
|
* @return {Array}
|
||
|
*/
|
||
|
parseTable (data) {
|
||
|
const lines = data.split(/(\r\n\r\n|\r\n\n|\n\r\n)|\n\n/).filter(line => {
|
||
|
return line.trim().length > 0
|
||
|
}).map((e) => e.split(/(\r\n|\n|\r)/).filter(line => line.trim().length > 0))
|
||
|
|
||
|
// Join multi-ligne value
|
||
|
lines.forEach((line) => {
|
||
|
for (let index = 0; line[index];) {
|
||
|
const entry = line[index]
|
||
|
if (entry.startsWith(' ')) {
|
||
|
line[index - 1] += entry.trimLeft()
|
||
|
line.splice(index, 1)
|
||
|
} else {
|
||
|
index += 1
|
||
|
}
|
||
|
}
|
||
|
})
|
||
|
|
||
|
return lines.map(line => {
|
||
|
const row = {}
|
||
|
line.forEach((string) => {
|
||
|
const splitterIndex = string.indexOf(':')
|
||
|
const key = string.slice(0, splitterIndex).trim()
|
||
|
row[key] = string.slice(splitterIndex + 1).trim()
|
||
|
})
|
||
|
|
||
|
return row
|
||
|
})
|
||
|
}
|
||
|
}
|
||
|
|
||
|
module.exports = utils
|