utils.ts 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. import { showToast } from "./components/ui-lib";
  2. import Locale from "./locales";
  3. export function trimTopic(topic: string) {
  4. const s = topic.split("");
  5. let lastChar = s.at(-1); // 获取 s 的最后一个字符
  6. let pattern = /[,。!?、]/; // 定义匹配中文标点符号的正则表达式
  7. while (lastChar && pattern.test(lastChar!)) {
  8. s.pop();
  9. lastChar = s.at(-1);
  10. }
  11. return s.join("");
  12. }
  13. export function copyToClipboard(text: string) {
  14. navigator.clipboard
  15. .writeText(text)
  16. .then((res) => {
  17. showToast(Locale.Copy.Success);
  18. })
  19. .catch((err) => {
  20. showToast(Locale.Copy.Failed);
  21. });
  22. }
  23. export function downloadAs(text: string, filename: string) {
  24. const element = document.createElement("a");
  25. element.setAttribute(
  26. "href",
  27. "data:text/plain;charset=utf-8," + encodeURIComponent(text)
  28. );
  29. element.setAttribute("download", filename);
  30. element.style.display = "none";
  31. document.body.appendChild(element);
  32. element.click();
  33. document.body.removeChild(element);
  34. }
  35. export function isIOS() {
  36. const userAgent = navigator.userAgent.toLowerCase();
  37. return /iphone|ipad|ipod/.test(userAgent);
  38. }
  39. export function selectOrCopy(el: HTMLElement, content: string) {
  40. const currentSelection = window.getSelection();
  41. if (currentSelection?.type === "Range") {
  42. return false;
  43. }
  44. copyToClipboard(content);
  45. return true;
  46. }