/** * kw * @author oldj * @blog http://oldj.net */ 'use strict' function kw2re (kw) { // 模糊搜索 let r let m let flag = [] if (kw === '/') { return } else if ((m = kw.match(/^\/([^\/]+)\/?(\w*)$/))) { if (m[2].indexOf('i') > -1) { flag.push('i') } // if (m[2].indexOf('g') > -1) { flag.push('g') // } try { r = new RegExp(m[1], flag.join('')) } catch (e) { } } else if (kw.indexOf('*') > -1) { try { r = new RegExp(kw.replace(/\*/g, '.*'), 'ig') } catch (e) { } } return r } exports.findPositions = function (kw, code) { if (!kw || kw === '/') return [] let r = kw2re(kw) if (!r) { try { r = new RegExp(kw .replace(/([\.\?\*\+\^\$\(\)\-\[\]\{\}])/g, '\\$1') , 'ig') } catch (e) { console.log(e) return [] } } let indexes = [] let lines = code.split('\n') lines.map((ln, idx) => { let match let max_loop = 30 while (match = r.exec(ln)) { indexes.push([ {line: idx, ch: match.index}, {line: idx, ch: match.index + match[0].length} ]) max_loop-- if (max_loop < 0) break } }) return indexes } exports.kw2re = kw2re