You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
111 lines
3.0 KiB
111 lines
3.0 KiB
// 匹配日期的正则
|
|
const rDate = [{
|
|
reg: /((\d{4})|(\d{2}))(-((0\d)|(\d{2})|(\d{1}))){2}/,
|
|
flag: '-' // yyyy-mm-dd|yy-mm-dd
|
|
},
|
|
{
|
|
reg: /((\d{4})|(\d{2}))(\/((0\d)|(\d{2})|(\d{1}))){2}/,
|
|
flag: '/'// yyyy/mm/dd|yy/mm/dd
|
|
},
|
|
{
|
|
reg: /(\d{8})|(\d{6})/,
|
|
flag: 'number'// yyyymmdd|yymmdd
|
|
}]
|
|
|
|
/**
|
|
* 获取TODO注释中的DDL,是则返回日期值及其todo内容
|
|
* @param {String} value 待操作字符串
|
|
* @param {String[]} ddlSymbol 截止时间标识符
|
|
* @param {STring} todoSymbol
|
|
* @return {Object}
|
|
*/
|
|
function getDDLAndText(value, ddlSymbol, todoSymbol) {
|
|
let text = value.slice(value.indexOf(ddlSymbol) + ddlSymbol.length),
|
|
date = ''
|
|
for (const rdate of rDate) {
|
|
const { reg, flag } = rdate
|
|
const res = text.match(reg)
|
|
if (res) {
|
|
const [dateStr] = res
|
|
// 再次校验匹配的日期日期是否合法
|
|
if (reg.test(dateStr)) {
|
|
let year, month, day
|
|
if (flag !== 'number') {
|
|
let ymd = dateStr.split(flag)
|
|
ymd = ymd.map(v => {
|
|
return v.length === 1 ? `0${v}` : v
|
|
})
|
|
year = ymd[0]
|
|
month = ymd[1]
|
|
day = ymd[2]
|
|
} else {
|
|
const { length } = dateStr
|
|
day = dateStr.slice(length - 2)
|
|
month = dateStr.slice(length - 4, length - 2)
|
|
year = dateStr.slice(0, length - 4)
|
|
}
|
|
if (year.length === 2) {
|
|
year = new Date().getFullYear().toString().slice(0, 2) + year
|
|
}
|
|
text = text.slice(text.indexOf(dateStr) + dateStr.length)
|
|
date = `${year}-${month}-${day}`
|
|
// 日期不合格也pass掉
|
|
if (month > 12 || day > 31) {
|
|
date = ''
|
|
}
|
|
break
|
|
}
|
|
}
|
|
}
|
|
return {
|
|
text,
|
|
date
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 解析TODO中的内容,返回一个Obj
|
|
* @param {String} str TODO的注释内容
|
|
* @param {String[]} ddlSymbols 截止日期标识符数组
|
|
* @param {String} todoSymbol TODO 的flag
|
|
* @return {Object}
|
|
*/
|
|
function parseTODO(str, ddlSymbols, todoSymbol) {
|
|
const ddlSymbol = getDDLSymbol(str, ddlSymbols)
|
|
// 如果没有DDL标志
|
|
if (!ddlSymbol) {
|
|
return {
|
|
date: null,
|
|
text: str.slice(str.indexOf(todoSymbol) + todoSymbol.length)
|
|
}
|
|
}
|
|
return getDDLAndText(str, ddlSymbol, todoSymbol)
|
|
}
|
|
|
|
/**
|
|
* 获取截止日期的标志
|
|
* @param {String} str
|
|
* @param {String[]} ddls
|
|
*/
|
|
function getDDLSymbol(str, ddls) {
|
|
for (const flag of ddls) {
|
|
if (str.includes(flag)) {
|
|
return flag
|
|
}
|
|
}
|
|
return ''
|
|
}
|
|
|
|
/**
|
|
* 将数组中的所有字符串转为小写
|
|
* @param {Array} arr
|
|
*/
|
|
function toLowerCaseArray(arr) {
|
|
return arr.map(v => v.toLowerCase())
|
|
}
|
|
|
|
module.exports = {
|
|
getDDLAndText,
|
|
parseTODO,
|
|
toLowerCaseArray
|
|
}
|