utils.js 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. const fileHeader = {
  2. "/9j": { type: 'image', suffix: "JPG" },
  3. "iVB": { type: 'image', suffix: "PNG" },
  4. "Qk0": { type: 'image', suffix: "BMP" },
  5. "SUk": { type: 'image', suffix: "TIFF" },
  6. "JVB": { type: 'image', suffix: "PDF" },
  7. "UEs": { type: 'image', suffix: "OFD" },
  8. "IyF": { type: 'audio', suffix: "AMR" }
  9. };
  10. /**
  11. * 根据base64的前三个字符判断文件格式
  12. * @param base64
  13. * @returns base64 string
  14. */
  15. export function addBase64head(base64) {
  16. if (base64.startsWith('data:/') || base64.startsWith('http')) {
  17. return base64;
  18. }
  19. const head = base64.substr(0, 3);
  20. if (fileHeader[head]) {
  21. return `data:${fileHeader[head].type}/${fileHeader[head].suffix.toLowerCase()};base64,${base64}`;
  22. }
  23. // 直接返回
  24. return base64;
  25. }
  26. // 格式化时间
  27. export function formatTime(time, format, locale) {
  28. format = Object.assign({
  29. year: locale.message.year,
  30. month: locale.message.month,
  31. day: locale.message.day,
  32. hour: locale.message.hour,
  33. minute: locale.message.minute
  34. }, format || {});
  35. if (!time) {
  36. return null;
  37. }
  38. const date = new Date(time);
  39. const year = date.getFullYear();
  40. const month = date.getMonth() + 1;
  41. const day = date.getDate();
  42. let hour = date.getHours() + "";
  43. if (hour.length < 2) {
  44. hour = '0' + hour;
  45. }
  46. let minute = date.getMinutes() + "";
  47. if (minute.length < 2) {
  48. minute = '0' + minute;
  49. }
  50. const now = new Date();
  51. const dValue = judgeDay(date);
  52. if (dValue === -1) {
  53. // let yesterday = locale ? locale.conversation.yesterday : '';
  54. let yesterday = locale.conversation.yesterday;
  55. // return `${yesterday} ${hour}${format.hour}${minute}${format.minute}`;
  56. // return `${yesterday} ${hour}${format.hour}${minute}${format.minute}`;
  57. return `${yesterday}`;
  58. }
  59. if (now.getFullYear() === year) {
  60. if (now.toDateString() === date.toDateString()) {
  61. return `${hour}:${minute}`;
  62. }
  63. return `${month}/${day}`;
  64. }
  65. return locale.area === 'zh_CN' ? `${year}/${month}/${day}` : `${month}/${day}/${year}`;
  66. // else if (dValue === -2) {
  67. // // let before = locale ? locale.conversation.before : '';
  68. // let before = locale.conversation.before;
  69. // return `${before} ${hour}${format.hour}${minute}${format.minute}`;
  70. // }
  71. // 同年
  72. // if (now.getFullYear() === year) {
  73. // // 同月
  74. // if (now.getMonth() + 1 === month) {
  75. // // 同天
  76. // if (now.toDateString() === date.toDateString()) {
  77. // return `${hour}${format.hour}${minute}${format.minute}`;
  78. // } else {
  79. // return `${month}${format.month}${day}${format.day} ${hour}${format.hour}${minute}${format.minute}`;
  80. // }
  81. // } else {
  82. // return `${month}${format.month}${day}${format.day} ${hour}${format.hour}${minute}${format.minute}`;
  83. // }
  84. // }
  85. // return `${year}${format.year}${month}${format.month}`;
  86. }
  87. function judgeDay(sourceDate, targetDate = new Date()) {
  88. var year = sourceDate.getFullYear();
  89. var month = sourceDate.getMonth() + 1;
  90. var day = sourceDate.getDate();
  91. var d1 = new Date(year + '/' + month + '/' + day).getTime();
  92. var y = targetDate.getFullYear();
  93. var m = targetDate.getMonth() + 1;
  94. var d = targetDate.getDate();
  95. var d2 = new Date(y + '/' + m + '/' + d).getTime();
  96. var iday = (d1 - d2) / 1000 / 60 / 60 / 24;
  97. return iday;
  98. }
  99. export function getCursortPosition(element) {
  100. var caretOffset = 0;
  101. var doc = element.ownerDocument || element.document;
  102. var win = doc.defaultView || doc.parentWindow;
  103. var sel;
  104. if (typeof win.getSelection != "undefined") { //谷歌、火狐
  105. sel = win.getSelection();
  106. if (sel.rangeCount > 0) { //选中的区域
  107. var range = win.getSelection().getRangeAt(0);
  108. var preCaretRange = range.cloneRange(); //克隆一个选中区域
  109. preCaretRange.selectNodeContents(element); //设置选中区域的节点内容为当前节点
  110. preCaretRange.setEnd(range.endContainer, range.endOffset); //重置选中区域的结束位置
  111. caretOffset = preCaretRange.toString().length;
  112. }
  113. }
  114. else if ((sel = doc.selection) && sel.type != "Control") { //IE
  115. var textRange = sel.createRange();
  116. var preCaretTextRange = doc.body.createTextRange();
  117. preCaretTextRange.moveToElementText(element);
  118. preCaretTextRange.setEndPoint("EndToEnd", textRange);
  119. caretOffset = preCaretTextRange.text.length;
  120. }
  121. return caretOffset;
  122. }
  123. /**
  124. * 获取光标前的文本
  125. * @param containerEl
  126. * @returns
  127. */
  128. export function getTextBeforeCursor(containerEl) {
  129. var precedingChar = '', sel, range, precedingRange;
  130. if (window.getSelection) {
  131. sel = window.getSelection();
  132. if (sel.rangeCount > 0) {
  133. range = sel.getRangeAt(0).cloneRange();
  134. range.collapse(true);
  135. range.setStart(containerEl, 0);
  136. precedingChar = range.cloneContents();
  137. }
  138. }
  139. else if ((sel = document.selection)) {
  140. range = sel.createRange();
  141. precedingRange = range.duplicate();
  142. precedingRange.moveToElementText(containerEl);
  143. precedingRange.setEndPoint("EndToStart", range);
  144. precedingChar = precedingRange.htmlText;
  145. }
  146. return [precedingChar, range];
  147. }
  148. export function delHtmlTag(str) {
  149. //正则去掉所有的html标记
  150. return str.replace(/<[^>]+>/g, '');
  151. }
  152. export function deepClone(target) {
  153. let result;
  154. if (typeof target === 'object') {
  155. if (Array.isArray(target)) {
  156. result = [];
  157. for (const i in target) {
  158. result.push(deepClone(target[i]));
  159. }
  160. }
  161. else if (target === null) {
  162. result = null;
  163. }
  164. else if (target instanceof RegExp) {
  165. result = target;
  166. }
  167. else {
  168. result = {};
  169. for (const i in target) {
  170. result[i] = deepClone(target[i]);
  171. }
  172. }
  173. }
  174. else {
  175. result = target;
  176. }
  177. return result;
  178. }
  179. export function formatTextMessage(content) {
  180. // const urlReg = new RegExp('(https?|ftp|file)://[-A-Za-z0-9+&@#/%?=~_|!:,.;]+[-A-Za-z0-9+&@#/%=~_|]', 'g');
  181. const urlReg = /(((^https?:(?:\/\/)?)(?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+|(?:www.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[\w]*))?)$/g;
  182. // 简单的过滤
  183. content = content.replace('<', '&lt;');
  184. content = content.replace('>', '&gt;');
  185. if (urlReg.test(content)) {
  186. content = content.replace(urlReg, a => {
  187. let prefix = '';
  188. if (a.indexOf('http:') < 0 && a.indexOf('https:') < 0) {
  189. prefix = '//';
  190. }
  191. return `<a target="_blank" class="url-wrap" href="${prefix}${a}">${a}</a>`;
  192. });
  193. }
  194. return content;
  195. }