kw.js 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. /**
  2. * kw
  3. * @author oldj
  4. * @blog http://oldj.net
  5. */
  6. 'use strict'
  7. function kw2re (kw) {
  8. // 模糊搜索
  9. let r
  10. let m
  11. let flag = []
  12. if (kw === '/') {
  13. return
  14. } else if ((m = kw.match(/^\/([^\/]+)\/?(\w*)$/))) {
  15. if (m[2].indexOf('i') > -1) {
  16. flag.push('i')
  17. }
  18. // if (m[2].indexOf('g') > -1) {
  19. flag.push('g')
  20. // }
  21. try {
  22. r = new RegExp(m[1], flag.join(''))
  23. } catch (e) {
  24. }
  25. } else if (kw.indexOf('*') > -1) {
  26. try {
  27. r = new RegExp(kw.replace(/\*/g, '.*'), 'ig')
  28. } catch (e) {
  29. }
  30. }
  31. return r
  32. }
  33. exports.findPositions = function (kw, code) {
  34. if (!kw || kw === '/') return []
  35. let r = kw2re(kw)
  36. if (!r) {
  37. try {
  38. r = new RegExp(kw
  39. .replace(/([\.\?\*\+\^\$\(\)\-\[\]\{\}])/g, '\\$1')
  40. , 'ig')
  41. } catch (e) {
  42. console.log(e)
  43. return []
  44. }
  45. }
  46. let indexes = []
  47. let lines = code.split('\n')
  48. lines.map((ln, idx) => {
  49. let match
  50. let max_loop = 30
  51. while (match = r.exec(ln)) {
  52. indexes.push([
  53. {line: idx, ch: match.index},
  54. {line: idx, ch: match.index + match[0].length}
  55. ])
  56. max_loop--
  57. if (max_loop < 0) break
  58. }
  59. })
  60. return indexes
  61. }
  62. exports.kw2re = kw2re