common.js 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  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. ['n', 'ń', 'ň', 'ǹ', 'n'],
  31. ['m̄', 'ḿ', 'm', 'm̀', 'm'],
  32. ];
  33. /**
  34. * 添加声调
  35. * @param {Number} number
  36. * @param {String} con
  37. * @returns String
  38. */
  39. export function addTone(number, con) {
  40. const zmList = ['a', 'o', 'e', 'i', 'u', 'v', 'ü', 'A', 'O', 'E', 'I', 'U', 'n', 'm'];
  41. let cons = con;
  42. if (number) {
  43. for (let i = 0; i < zmList.length; i++) {
  44. let zm = zmList[i];
  45. if (con.includes(zm)) {
  46. let zm2 = tone_data[i][number - 1];
  47. if (con.includes('iu')) {
  48. zm2 = tone_data[4][number - 1];
  49. cons = con.replace('u', zm2);
  50. } else if (con.includes('ui')) {
  51. zm2 = tone_data[3][number - 1];
  52. cons = con.replace('i', zm2);
  53. } else if (/yv|jv|qv|xv/.test(con)) {
  54. zm2 = tone_data[4][number - 1];
  55. cons = con.replace('v', zm2);
  56. } else if (/yü|jü|qü|xü/.test(con)) {
  57. zm2 = tone_data[4][number - 1];
  58. cons = con.replace('ü', zm2);
  59. } else {
  60. cons = con.replace(zm, zm2);
  61. }
  62. break;
  63. }
  64. }
  65. }
  66. return cons;
  67. }
  68. export function handleToneValue(valItem) {
  69. let numList = [];
  70. if (/[A-Za-zü]+\d/g.test(valItem)) {
  71. valItem.split('').forEach((item, i) => {
  72. if (/\d/.test(item)) {
  73. let numIndex = numList.length === 0 ? 0 : numList[numList.length - 1].index;
  74. let con = valItem.substring(numIndex, i).replace(/\d/g, '');
  75. numList.push({
  76. number: item,
  77. con,
  78. });
  79. }
  80. });
  81. } else {
  82. numList = [];
  83. }
  84. return numList.length === 0 ? [{ con: valItem }] : numList;
  85. }
  86. // 全屏方法兼容
  87. export function fullScreenCompatibility(dom) {
  88. if (dom.requestFullscreen) {
  89. return dom.requestFullscreen();
  90. } else if (dom.webkitRequestFullScreen) {
  91. return dom.webkitRequestFullScreen();
  92. } else if (dom.mozRequestFullScreen) {
  93. return dom.mozRequestFullScreen();
  94. }
  95. return dom.msRequestFullscreen();
  96. }
  97. /**
  98. * @description 退出全屏方法兼容
  99. */
  100. export function exitFullScreenCompatibility() {
  101. if (document.exitFullscreen) {
  102. return document.exitFullscreen();
  103. } else if (document.webkitExitFullscreen) {
  104. return document.webkitExitFullscreen();
  105. } else if (document.mozCancelFullScreen) {
  106. return document.mozCancelFullScreen();
  107. }
  108. return document.msExitFullscreen();
  109. }
  110. /**
  111. * @description 切换全屏
  112. * @param {HTMLElement} dom 需要全屏的元素
  113. * @return {Promise<void>}
  114. */
  115. export function toggleFullScreen(dom) {
  116. if (document.fullscreenElement === null) {
  117. fullScreenCompatibility(dom);
  118. } else {
  119. exitFullScreenCompatibility();
  120. }
  121. }
  122. /**
  123. * @description 计算数组的深度
  124. * @param {Array} arr 需要计算深度的数组
  125. * @returns {Number} 数组的深度
  126. */
  127. export function getArrayDepth(arr) {
  128. if (!Array.isArray(arr)) return 0;
  129. if (arr.length === 0) return 1;
  130. return 1 + Math.max(...arr.map((item) => (Array.isArray(item) ? getArrayDepth(item) : 0)));
  131. }
  132. /**
  133. * 过滤 html,防止 xss 攻击
  134. * @param {string} html 需要过滤的html
  135. * @returns {string} 过滤后的html
  136. */
  137. export function sanitizeHTML(html) {
  138. return DOMPurify.sanitize(html, { ADD_ATTR: ['target'] });
  139. }