common.js 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. import DOMPurify from 'dompurify';
  2. /**
  3. * 换算数据大小
  4. * @param {number} size
  5. * @returns {string} 换算后的数据大小,两位小数带单位
  6. */
  7. export function conversionSize(size) {
  8. let _size = size;
  9. const units = ['B', 'KB', 'MB', 'GB'];
  10. let factor = 0;
  11. while (_size > 1024 && factor < units.length - 1) {
  12. _size /= 1024;
  13. factor += 1;
  14. }
  15. return `${_size.toFixed(2)}${units[factor]}`;
  16. }
  17. export const tone_data = [
  18. ['ā', 'á', 'ǎ', 'à', 'a'],
  19. ['ō', 'ó', 'ǒ', 'ò', 'o'],
  20. ['ē', 'é', 'ě', 'è', 'e'],
  21. ['ī', 'í', 'ǐ', 'ì', 'i'],
  22. ['ū', 'ú', 'ǔ', 'ù', 'u'],
  23. ['ǖ', 'ǘ', 'ǚ', 'ǜ', 'ü'],
  24. ['ǖ', 'ǘ', 'ǚ', 'ǜ', 'ü'],
  25. ['Ā', 'Á', 'Â', 'À', 'A'],
  26. ['Ō', 'Ó', 'Ô', 'Ò', 'O'],
  27. ['Ē', 'É', 'Ê', 'È', 'E'],
  28. ['Ī', 'Í', 'Î', 'Ì', 'I'],
  29. ['Ū', 'Ú', 'Û', 'Ù', 'U'],
  30. ];
  31. /**
  32. * 添加声调
  33. * @param {Number} number
  34. * @param {String} con
  35. * @returns String
  36. */
  37. export function addTone(number, con) {
  38. const zmList = ['a', 'o', 'e', 'i', 'u', 'v', 'ü', 'A', 'O', 'E', 'I', 'U'];
  39. let cons = con;
  40. if (number) {
  41. for (let i = 0; i < zmList.length; i++) {
  42. let zm = zmList[i];
  43. if (con.includes(zm)) {
  44. let zm2 = tone_data[i][number - 1];
  45. if (con.includes('iu')) {
  46. zm2 = tone_data[4][number - 1];
  47. cons = con.replace('u', zm2);
  48. } else if (con.includes('ui')) {
  49. zm2 = tone_data[3][number - 1];
  50. cons = con.replace('i', zm2);
  51. } else if (/yv|jv|qv|xv/.test(con)) {
  52. zm2 = tone_data[4][number - 1];
  53. cons = con.replace('v', zm2);
  54. } else if (/yü|jü|qü|xü/.test(con)) {
  55. zm2 = tone_data[4][number - 1];
  56. cons = con.replace('ü', zm2);
  57. } else {
  58. cons = con.replace(zm, zm2);
  59. }
  60. break;
  61. }
  62. }
  63. }
  64. return cons;
  65. }
  66. export function handleToneValue(valItem) {
  67. let numList = [];
  68. if (/[A-Za-zü]+\d/g.test(valItem)) {
  69. valItem.split('').forEach((item, i) => {
  70. if (/\d/.test(item)) {
  71. let numIndex = numList.length === 0 ? 0 : numList[numList.length - 1].index;
  72. let con = valItem.substring(numIndex, i).replace(/\d/g, '');
  73. numList.push({
  74. number: item,
  75. con,
  76. });
  77. }
  78. });
  79. } else {
  80. numList = [];
  81. }
  82. return numList.length === 0 ? [{ con: valItem }] : numList;
  83. }
  84. // 全屏方法兼容
  85. export function fullScreenCompatibility(dom) {
  86. if (dom.requestFullscreen) {
  87. return dom.requestFullscreen();
  88. } else if (dom.webkitRequestFullScreen) {
  89. return dom.webkitRequestFullScreen();
  90. } else if (dom.mozRequestFullScreen) {
  91. return dom.mozRequestFullScreen();
  92. }
  93. return dom.msRequestFullscreen();
  94. }
  95. /**
  96. * @description 退出全屏方法兼容
  97. */
  98. export function exitFullScreenCompatibility() {
  99. if (document.exitFullscreen) {
  100. return document.exitFullscreen();
  101. } else if (document.webkitExitFullscreen) {
  102. return document.webkitExitFullscreen();
  103. } else if (document.mozCancelFullScreen) {
  104. return document.mozCancelFullScreen();
  105. }
  106. return document.msExitFullscreen();
  107. }
  108. /**
  109. * @description 切换全屏
  110. * @param {HTMLElement} dom 需要全屏的元素
  111. * @return {Promise<void>}
  112. */
  113. export function toggleFullScreen(dom) {
  114. if (document.fullscreenElement === null) {
  115. fullScreenCompatibility(dom);
  116. } else {
  117. exitFullScreenCompatibility();
  118. }
  119. }
  120. /**
  121. * @description 计算数组的深度
  122. * @param {Array} arr 需要计算深度的数组
  123. * @returns {Number} 数组的深度
  124. */
  125. export function getArrayDepth(arr) {
  126. if (!Array.isArray(arr)) return 0;
  127. if (arr.length === 0) return 1;
  128. return 1 + Math.max(...arr.map((item) => (Array.isArray(item) ? getArrayDepth(item) : 0)));
  129. }
  130. /**
  131. * 过滤 html,防止 xss 攻击
  132. * @param {string} html 需要过滤的html
  133. * @returns {string} 过滤后的html
  134. */
  135. export function sanitizeHTML(html) {
  136. return DOMPurify.sanitize(html);
  137. }