PaliText.tsx 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. import { useEffect, useState } from "react";
  2. import { Typography } from "antd";
  3. import { useAppSelector } from "../../../hooks";
  4. import { settingInfo } from "../../../reducers/setting";
  5. import { getTerm } from "../../../reducers/term-vocabulary";
  6. import { GetUserSetting } from "../../auth/setting/default";
  7. import type { TCodeConvertor } from "../utilities"
  8. import { roman_to_my, my_to_roman } from "../../code/my";
  9. import { roman_to_si } from "../../code/si";
  10. import { roman_to_thai } from "../../code/thai";
  11. import { roman_to_taitham } from "../../code/tai-tham";
  12. import store from "../../../store";
  13. import { lookup as _lookup } from "../../../reducers/command";
  14. import type { BaseType } from "antd/lib/typography/Base"
  15. const { Text } = Typography;
  16. interface IWidget {
  17. style?: React.CSSProperties;
  18. text?: string;
  19. code?: string;
  20. primary?: boolean;
  21. termToLocal?: boolean;
  22. lookup?: boolean;
  23. textType?: BaseType;
  24. }
  25. const PaliTextWidget = ({
  26. text,
  27. style,
  28. code = "roman",
  29. ___primary = true,
  30. termToLocal = true,
  31. lookup = false,
  32. textType,
  33. }: IWidget) => {
  34. const [paliText, setPaliText] = useState<string>();
  35. const settings = useAppSelector(settingInfo);
  36. const terms = useAppSelector(getTerm);
  37. let romanText: string | undefined;
  38. if (code === "my") {
  39. romanText = my_to_roman(text);
  40. } else {
  41. romanText = text;
  42. }
  43. useEffect(() => {
  44. if (!termToLocal) {
  45. return;
  46. }
  47. const lowerCase = paliText?.toLowerCase();
  48. const localName = terms?.find((item) => item.word === lowerCase)?.meaning;
  49. if (localName) {
  50. setPaliText(localName);
  51. }
  52. }, [paliText, termToLocal, terms]);
  53. useEffect(() => {
  54. const _paliCode1 = GetUserSetting("setting.pali.script.primary", settings);
  55. if (typeof _paliCode1 === "string") {
  56. const paliConvertor = _paliCode1 as TCodeConvertor;
  57. //编码转换
  58. let original = text;
  59. if (code === "my") {
  60. original = my_to_roman(text);
  61. }
  62. switch (paliConvertor) {
  63. case "roman_to_my":
  64. setPaliText(roman_to_my(original));
  65. break;
  66. case "my_to_roman":
  67. setPaliText(my_to_roman(original));
  68. break;
  69. case "roman_to_si":
  70. setPaliText(roman_to_si(original));
  71. break;
  72. case "roman_to_thai":
  73. setPaliText(roman_to_thai(original));
  74. break;
  75. case "roman_to_taitham":
  76. setPaliText(roman_to_taitham(original));
  77. break;
  78. default:
  79. if (code === "my") {
  80. setPaliText(my_to_roman(text));
  81. } else {
  82. setPaliText(text);
  83. }
  84. break;
  85. }
  86. }
  87. }, [text, settings, code]);
  88. const nodePali = text ? (
  89. <Text type={textType} style={style}>
  90. {paliText}
  91. </Text>
  92. ) : (
  93. <></>
  94. );
  95. if (lookup) {
  96. return (
  97. <Typography.Text
  98. style={{ cursor: "pointer" }}
  99. type={textType}
  100. onClick={() => {
  101. //发送点词查询消息
  102. if (typeof romanText === "string") {
  103. store.dispatch(_lookup(romanText));
  104. }
  105. }}
  106. >
  107. {nodePali}
  108. </Typography.Text>
  109. );
  110. } else {
  111. return nodePali;
  112. }
  113. };
  114. export default PaliTextWidget;