htmlProcessor.js 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. /**
  2. * HTML内容处理工具
  3. * 用于处理富文本内容中的格式问题
  4. */
  5. /**
  6. * 处理HTML内容
  7. * @param {string} htmlContent - 原始HTML内容
  8. * @returns {string} 处理后的HTML内容
  9. */
  10. export function processHtmlContent(htmlContent) {
  11. if (!htmlContent) return ''
  12. let processedContent = htmlContent
  13. // 1. 处理段落中的前导空格,转换为缩进
  14. processedContent = processedContent.replace(/<p>\s+([^<]*)<\/p>/g, '<p class="indent">$1</p>')
  15. // 2. 处理段落内部的多个连续空格
  16. processedContent = processedContent.replace(
  17. /<p>([^<]*?)\s{2,}([^<]*?)<\/p>/g,
  18. '<p><span class="indent-text">$1</span>$2</p>',
  19. )
  20. // 3. 处理图片容器,添加统一的样式类
  21. processedContent = processedContent.replace(
  22. /<div class="media-wrap image-wrap"><img src="([^"]*)"/g,
  23. '<div class="media-wrap image-wrap processed-image"><img style="height: 80px;" src="$1" class="content-image"',
  24. )
  25. // 4. 处理音频容器(如果有的话)
  26. processedContent = processedContent.replace(
  27. /<div class="media-wrap audio-wrap">/g,
  28. '<div class="media-wrap audio-wrap processed-audio">',
  29. )
  30. // 5. 处理视频容器(如果有的话)
  31. processedContent = processedContent.replace(
  32. /<div class="media-wrap video-wrap">/g,
  33. '<div class="media-wrap video-wrap processed-video">',
  34. )
  35. // 6. 移除空的段落标签
  36. processedContent = processedContent.replace(/<p><\/p>/g, '')
  37. // 7. 处理图片的alt属性
  38. processedContent = processedContent.replace(
  39. /<img([^>]*?)src="([^"]*?)"([^>]*?)\/?>/g,
  40. '<img$1src="$2" alt="内容图片" loading="lazy"$3/>',
  41. )
  42. return processedContent
  43. }
  44. /**
  45. * 获取处理HTML内容的CSS样式
  46. * @returns {string} CSS样式字符串
  47. */
  48. export function getHtmlContentStyles() {
  49. return `
  50. /* 缩进段落样式 */
  51. .indent {
  52. text-indent: 2em;
  53. margin-bottom: 1em;
  54. line-height: 1.6;
  55. }
  56. /* 缩进文本样式 */
  57. .indent-text {
  58. margin-left: 2em;
  59. }
  60. /* 处理后的图片容器样式 */
  61. .processed-image {
  62. margin: 20px 0;
  63. text-align: center;
  64. background: #f8f9fa;
  65. border-radius: 8px;
  66. padding: 15px;
  67. box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
  68. }
  69. /* 内容图片样式 */
  70. .content-image {
  71. max-width: 100%;
  72. height: auto;
  73. border-radius: 6px;
  74. box-shadow: 0 2px 12px rgba(0, 0, 0, 0.15);
  75. transition: transform 0.3s ease;
  76. }
  77. .content-image:hover {
  78. transform: scale(1.02);
  79. }
  80. /* 处理后的音频容器样式 */
  81. .processed-audio {
  82. margin: 15px 0;
  83. padding: 15px;
  84. background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
  85. border-radius: 10px;
  86. text-align: center;
  87. }
  88. /* 处理后的视频容器样式 */
  89. .processed-video {
  90. margin: 20px 0;
  91. padding: 10px;
  92. background: #000;
  93. border-radius: 8px;
  94. text-align: center;
  95. }
  96. /* 通用媒体容器样式 */
  97. .media-wrap {
  98. position: relative;
  99. overflow: hidden;
  100. }
  101. /* 响应式处理 */
  102. @media (max-width: 768px) {
  103. .processed-image {
  104. margin: 15px 0;
  105. padding: 10px;
  106. }
  107. .indent {
  108. text-indent: 1.5em;
  109. }
  110. .indent-text {
  111. margin-left: 1.5em;
  112. }
  113. }
  114. `
  115. }