WordCard.tsx 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. /* eslint-disable jsx-a11y/anchor-is-valid */
  2. import { Space, Typography } from "antd";
  3. import type { IWordByDict } from "./WordCardByDict";
  4. import GrammarPop from "./GrammarPop";
  5. import WordCardByDict from "./WordCardByDict";
  6. import { useIntl } from "react-intl";
  7. import Community from "./Community";
  8. import TermCommunity from "../term/TermCommunity";
  9. const { Title, Text } = Typography;
  10. export interface IWordGrammar {
  11. word: string;
  12. type: string;
  13. grammar: string;
  14. parent: string;
  15. factors: string;
  16. confidence: number;
  17. }
  18. export interface IWidgetWordCardData {
  19. word: string;
  20. factors: string;
  21. parents: string;
  22. case?: string[];
  23. grammar: IWordGrammar[];
  24. anchor: string;
  25. dict: IWordByDict[];
  26. }
  27. interface IWidgetWordCard {
  28. data: IWidgetWordCardData;
  29. }
  30. const WordCardWidget = ({ data }: IWidgetWordCard) => {
  31. const intl = useIntl();
  32. const caseList = data.case?.map((element) => {
  33. return element.split("|").map((it, id) => {
  34. if (it.slice(0, 1) === "@") {
  35. const [showText, keyText] = it.slice(1).split("-");
  36. return <GrammarPop key={id} gid={keyText} text={showText} />;
  37. } else {
  38. return <span key={id * 200}>{it}</span>;
  39. }
  40. });
  41. });
  42. return (
  43. <>
  44. <Title level={4} id={data.anchor}>
  45. {data.word}
  46. </Title>
  47. {data.grammar.length > 0 ? (
  48. <WordCardByDict
  49. data={{
  50. dictname: "语法信息",
  51. description: "列出可能的语法信息供参考",
  52. anchor: "anchor",
  53. }}
  54. >
  55. <div>
  56. <Text>
  57. {data.grammar.length > 0 ? data.grammar[0].factors : ""}
  58. </Text>
  59. </div>
  60. <div>
  61. <Text>{data.parents}</Text>
  62. </div>
  63. <div>
  64. {data.grammar
  65. .filter((item) => item.confidence > 0.5)
  66. .map((it, id) => {
  67. const grammar = it.grammar.split("$");
  68. const grammarGuide = grammar.map((item, id) => {
  69. const strCase = item.replaceAll(".", "");
  70. return (
  71. <GrammarPop
  72. key={id}
  73. gid={strCase}
  74. text={intl.formatMessage({
  75. id: `dict.fields.type.${strCase}.label`,
  76. defaultMessage: strCase,
  77. })}
  78. />
  79. );
  80. });
  81. return (
  82. <div key={id}>
  83. <Space>{grammarGuide}</Space>
  84. </div>
  85. );
  86. })}
  87. </div>
  88. <div>
  89. <Text>{caseList}</Text>
  90. </div>
  91. </WordCardByDict>
  92. ) : (
  93. <></>
  94. )}
  95. <Community word={data.word} />
  96. <TermCommunity word={data.word} />
  97. <div>
  98. {data.dict.map((it, id) => {
  99. return <WordCardByDict key={id} data={it} />;
  100. })}
  101. </div>
  102. </>
  103. );
  104. };
  105. export default WordCardWidget;