third-party-verify.js 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. import { replaceKeyword } from '@jy/util'
  2. class ThirdPartyVerifyModel {
  3. constructor() {
  4. this.getKeywordsList()
  5. }
  6. // 将要匹配的列表
  7. keywordsList = []
  8. certificate = {
  9. // 证书名称
  10. name: [
  11. '质量管理体系认证',
  12. '工程建设施工质量管理体系认证',
  13. '环境管理体系认证',
  14. '职业健康安全管理体系认证',
  15. '危害分析和关键控制点',
  16. '食品安全管理体系认证',
  17. '信息技术服务管理体系认证',
  18. '信息安全管理体系认证',
  19. '五星售后服务认证 ',
  20. '五星品牌认证',
  21. '批发零售服务',
  22. '物业服务认证',
  23. ],
  24. // 证书编号
  25. number: [
  26. /(ISO\s{0,1}9001)/g,
  27. /(GB\/T\s{0,1}50430)/g,
  28. /(ISO\s{0,1}14001)/g,
  29. /(ISO\s{0,1}45001)/g,
  30. 'HACCP',
  31. /(ISO\s{0,1}2[027]000)/g, // ISO20000、ISO22000、ISO27000、
  32. ],
  33. // AAA关键词
  34. key: [
  35. '信用等级',
  36. '重合同守信用企业',
  37. '质量服务诚信单位',
  38. '重质量守信用单位',
  39. '重服务守信用',
  40. '资信等级',
  41. '诚信经营示范单位',
  42. '诚信企业家',
  43. '诚信经理人',
  44. '诚信供应商',
  45. ]
  46. }
  47. // 将certificate中的内容整合成一个数组
  48. getKeywordsList() {
  49. let arr = []
  50. const map = this.certificate
  51. for (const key in map) {
  52. const item = map[key]
  53. if (Array.isArray(item)) {
  54. arr = arr.concat(item)
  55. }
  56. }
  57. this.keywordsList = arr
  58. return arr
  59. }
  60. replaceKeysAndInsertMark(content) {
  61. // 字符串替换
  62. content = this.replaceKeys(content)
  63. // 将字符串转成dom
  64. this.contentDOM = this.createDomInMemory(content)
  65. // 插入button
  66. this.checkHighlightInsert(this.contentDOM)
  67. // 插入完成后在将dom转成字符串
  68. return this.contentDOM.innerHTML
  69. }
  70. // dom数组去重
  71. unique(array) {
  72. return array.filter(function (value, index, self) {
  73. return self.indexOf(value) === index
  74. })
  75. }
  76. // certificate相关 关键词替换
  77. replaceKeys(content) {
  78. // 1.先将关键词替换
  79. var replaced = replaceKeyword(content, this.keywordsList, "<span class='highlight-text third-party-verify-highlight'>$1</span>");
  80. // 2.替换关键词后面最近的一个中文句号(用来插入button)
  81. replaced = replaced.replace(/third-party-verify-highlight(.*?)(。|;|;)/g, function (match, p1, p2) {
  82. return match.replace(p2, `<span class='paragraph-last'>${p2}</span>`)
  83. })
  84. return replaced
  85. }
  86. getInsertButton() {
  87. const htmlString = '<span class="third-party-popover third-party-verify-button"><span class="icon icon-third-party-verify-logo"></span><span class="button-text">剑鱼认证服务</span></span>'
  88. const div = document.createElement('div')
  89. div.innerHTML = htmlString
  90. const dom = div.firstChild
  91. return dom
  92. }
  93. createDomInMemory(html) {
  94. var div = document.createElement('div')
  95. div.classList.add('com-detail')
  96. div.innerHTML = html
  97. return div
  98. }
  99. // 检查并插入button
  100. checkHighlightInsert(dom) {
  101. var container = dom;
  102. var verifyIconButton = container.querySelectorAll('.third-party-verify-button');
  103. if (verifyIconButton.length) return;
  104. var waitingInsertList = [];
  105. // 获取要插入元素
  106. var button = this.getInsertButton();
  107. // 1. 先找highlights同级next的.paragraph-last
  108. waitingInsertList = Array.from(container.querySelectorAll('.paragraph-last'));
  109. waitingInsertList = this.unique(waitingInsertList);
  110. if (waitingInsertList.length) {
  111. // 找到了.paragraph-last在其后插入button
  112. waitingInsertList.forEach(function (dom) {
  113. dom.insertAdjacentElement('afterend', button);
  114. });
  115. } else {
  116. // 2. 找不到.paragraph-last。找同级next的br
  117. waitingInsertList = this.findNextMark(dom, function (_this) {
  118. return _this.nextElementSibling && _this.nextElementSibling.tagName === 'BR';
  119. });
  120. if (waitingInsertList.length) {
  121. // 找到了br,则在其前面插入
  122. waitingInsertList.forEach(function (dom) {
  123. dom.insertAdjacentElement('beforebegin', button);
  124. });
  125. } else {
  126. // 3. 找不到br,找到其父级标签,并在其末尾插入
  127. waitingInsertList = this.findNextMark(dom, function (_this) {
  128. return _this.parentNode;
  129. });
  130. if (waitingInsertList.length) {
  131. // 找到了br,则在其前面插入
  132. waitingInsertList.forEach(function (dom) {
  133. dom.appendChild(button);
  134. });
  135. }
  136. }
  137. }
  138. return dom
  139. }
  140. findNextMark (dom, callback) {
  141. var waitingInsertList = [] // 待插入节点dom对象
  142. var container = dom
  143. var highlights = container.querySelectorAll('.third-party-verify-highlight')
  144. highlights.forEach(function () {
  145. var $mark = callback(this)
  146. var mark = $mark[0]
  147. if (mark) {
  148. waitingInsertList.push(mark)
  149. }
  150. })
  151. // 去重
  152. return this.unique(waitingInsertList)
  153. }
  154. }
  155. function useThirdPartyVerifyModel() {
  156. return new ThirdPartyVerifyModel()
  157. }
  158. export default useThirdPartyVerifyModel