WordCard.tsx 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  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. const { Title, Text } = Typography;
  9. export interface IWordGrammar {
  10. word: string;
  11. type: string;
  12. grammar: string;
  13. parent: string;
  14. factors: string;
  15. confidence: number;
  16. }
  17. export interface IWidgetWordCardData {
  18. word: string;
  19. factors: string;
  20. parents: string;
  21. case: string[];
  22. grammar: IWordGrammar[];
  23. anchor: string;
  24. dict: IWordByDict[];
  25. }
  26. interface IWidgetWordCard {
  27. data: IWidgetWordCardData;
  28. }
  29. const Widget = ({ data }: IWidgetWordCard) => {
  30. const intl = useIntl();
  31. const caseList = data.case.map((element) => {
  32. return element.split("|").map((it, id) => {
  33. if (it.slice(0, 1) === "@") {
  34. const [showText, keyText] = it.slice(1).split("-");
  35. return <GrammarPop key={id} gid={keyText} text={showText} />;
  36. } else {
  37. return <span key={id * 200}>{it}</span>;
  38. }
  39. });
  40. });
  41. return (
  42. <>
  43. <Title level={4} id={data.anchor}>
  44. {data.word}
  45. </Title>
  46. <div>
  47. <Text>{data.grammar.length > 0 ? data.grammar[0].factors : ""}</Text>
  48. </div>
  49. <div>
  50. <Text>{data.parents}</Text>
  51. </div>
  52. <div>
  53. {data.grammar
  54. .filter((item) => item.confidence > 0.5)
  55. .map((it, id) => {
  56. const grammar = it.grammar.split("$");
  57. const grammarGuide = grammar.map((item, id) => {
  58. const strCase = item.replaceAll(".", "");
  59. return (
  60. <GrammarPop
  61. key={id}
  62. gid={strCase}
  63. text={intl.formatMessage({
  64. id: `dict.fields.type.${strCase}.label`,
  65. })}
  66. />
  67. );
  68. });
  69. return (
  70. <div key={id}>
  71. <Space>{grammarGuide}</Space>
  72. </div>
  73. );
  74. })}
  75. </div>
  76. <div>
  77. <Text>{caseList}</Text>
  78. </div>
  79. <Community word={data.word} />
  80. <div>
  81. {data.dict.map((it, id) => {
  82. return <WordCardByDict key={id} data={it} />;
  83. })}
  84. </div>
  85. </>
  86. );
  87. };
  88. export default Widget;