WordCard.tsx 2.3 KB

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