content.js 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. import BaseModel from '../../../core/base'
  2. import useSummaryModel from '../transform/summary2'
  3. import useCommonTitleModel from '../transform/content'
  4. import useThirdPartyVerifyModel from '../transform/third-party-verify'
  5. import { replaceKeyword } from '@jy/util'
  6. const thirdPartyVerify = useThirdPartyVerifyModel()
  7. class ContentModel extends BaseModel {
  8. constructor(config) {
  9. super(config)
  10. }
  11. createModel() {
  12. return {
  13. moduleShow: {
  14. // 正文模块是否显示
  15. content: false,
  16. // 摘要模块是否显示
  17. summary: false
  18. },
  19. content: useCommonTitleModel().createModel(),
  20. summary: useSummaryModel().createModel()
  21. }
  22. }
  23. formatModel(data, isInit = false) {
  24. const result = this.createModel()
  25. const commonTitleModel = useCommonTitleModel()
  26. const summaryModel = useSummaryModel()
  27. // 基础信息
  28. if (data?.baseInfo) {
  29. result.content = commonTitleModel.transformModel(data)
  30. }
  31. // 摘要
  32. if (data?.abstract) {
  33. result.summary = summaryModel.transformModel(data)
  34. }
  35. if (result.content) {
  36. result.content.titleHighlighted = this.highlightTitleHTML(result.content.title, data, result)
  37. try {
  38. result.content.contentHighlighted = this.highlightContentHTML(result.content.content, data, result)
  39. } catch (error) {
  40. console.error(error)
  41. }
  42. }
  43. // 根据数据情况判断模块是否展示
  44. result.moduleShow.content = !!result.content?.content
  45. result.moduleShow.summary= Array.isArray(result.summary?.list) && result.summary?.list.length > 0
  46. return result
  47. }
  48. // 高亮标题
  49. highlightTitleHTML (title, data, formatted) {
  50. if (!title) return ''
  51. const { baseInfo } = data
  52. const projectName = baseInfo?.projectName
  53. const projectCode = baseInfo?.projectCode
  54. // 下划线高亮项目名称编号
  55. if (projectName && title.toLowerCase().indexOf(projectName.toLowerCase()) > -1) {
  56. title = replaceKeyword(title, projectName, '<span class="keyword keyword-underline project project-name hide-underline">$1</span>')
  57. }
  58. if (projectCode && title.toLowerCase().indexOf(projectCode.toLowerCase()) > -1) {
  59. title = replaceKeyword(title, projectCode, '<span class="keyword keyword-underline project project-code">$1</span>')
  60. }
  61. // ------------------
  62. // 关键词高亮
  63. let highlightKeys = []
  64. if (formatted.content && formatted.content.highlightKeys) {
  65. highlightKeys = formatted.content.highlightKeys
  66. }
  67. highlightKeys.forEach((key) => {
  68. title = replaceKeyword(title, key, '<span class="keyword highlight-text">$1</span>')
  69. })
  70. return title
  71. }
  72. // 高亮内容文本
  73. highlightContentHTML(content, data, formatted) {
  74. if (!content) return ''
  75. const { baseInfo } = data
  76. const { summary } = formatted
  77. const projectName = baseInfo?.projectName
  78. const projectCode = baseInfo?.projectCode
  79. content = content.replace(/[^\{\u4e00-\u9fa5]{1,90}{[^\}\u4e00-\u9fa5]+?}/g, '')
  80. // 将多个连续的br替换成一个
  81. content = content.replace(/(<br\s*\/?>)+/gi, '<br>')
  82. content = content.replace(/^((<br\/?>)|(&nbsp;))+/g, '')
  83. content = content.replace(/((<br\/?>)|(&nbsp;))+$/g, '')
  84. // 下划线高亮项目名称编号
  85. if(projectName && content.toLowerCase().indexOf(projectName.toLowerCase()) > -1){
  86. content = replaceKeyword(content, projectName, '<span class="keyword keyword-underline my-follow project project-name hide-underline">$1</span>')
  87. }
  88. if(projectCode && content.toLowerCase().indexOf(projectCode.toLowerCase()) > -1){
  89. content = replaceKeyword(content, projectCode, '<span class="keyword keyword-underline my-follow project project-code">$1</span>')
  90. }
  91. // 下划线高亮中标企业
  92. const winners = summary.winners
  93. if (Array.isArray(winners) && winners.length > 0) {
  94. for (let i = 0; i < winners.length; i++) {
  95. const winnerName = winners[i].name
  96. const winnerId = winners[i].id
  97. if (winnerName && content.toLowerCase().indexOf(winnerName.toLowerCase()) > -1) {
  98. content = replaceKeyword(content, winnerName, `<span data-eid='${winnerId}' class='keyword keyword-underline winner-name my-follow-ent'>$1</span>`)
  99. }
  100. }
  101. }
  102. // 表格兼容
  103. if(content.length > 10 && content.substring(0,6).toLowerCase() === '<tbody' && content.substring(content.length-8).toLowerCase() == '</tbody>'){
  104. content = '<table>' + content + '</table>'
  105. }
  106. // 表格外面添加盒子
  107. content = content.replace(/<table/g, `<div class="content-table-container"><table`).replace(/<\/table>/g, `</table></div>`)
  108. // 高亮第三方服务
  109. if (content) {
  110. content = thirdPartyVerify.replaceKeysAndInsertMark(content)
  111. }
  112. // ------------------
  113. // 关键词高亮
  114. let highlightKeys = []
  115. if (formatted.content && formatted.content.highlightKeys) {
  116. highlightKeys = formatted.content.highlightKeys
  117. }
  118. highlightKeys.forEach((key) => {
  119. content = replaceKeyword(content, key, '<span class="keyword highlight-text">$1</span>')
  120. })
  121. // freeView点击查看高亮
  122. // <span class="freeView">点击查看</span> ==替换==> <span class="freeView free-view highlight-text">点击查看</span>
  123. content = content.replace(/freeView/g, 'freeView free-view highlight-text')
  124. return content
  125. }
  126. }
  127. /**
  128. * /publicapply/detail/baseInfo
  129. * 基础信息接口数据模型转换
  130. */
  131. function useContentModel() {
  132. return new ContentModel()
  133. }
  134. export default useContentModel