-
-
Notifications
You must be signed in to change notification settings - Fork 737
/
View.tsx
118 lines (109 loc) · 3.09 KB
/
View.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
import React, { FC } from 'react'
import Speaker from '@/components/Speaker'
import {
BingResult,
BingResultLex,
BingResultMachine,
BingResultRelated
} from './engine'
import { ViewPorps } from '@/components/dictionaries/helpers'
import { StrElm } from '@/components/StrElm'
export const DictBing: FC<ViewPorps<BingResult>> = ({ result }) => {
switch (result.type) {
case 'lex':
return renderLex(result)
case 'machine':
return renderMachine(result)
case 'related':
return renderRelated(result)
default:
return null
}
}
export default DictBing
function renderLex(result: BingResultLex) {
return (
<>
<h1 className="dictBing-Title">{result.title}</h1>
{result.phsym && (
<ul className="dictBing-Phsym">
{result.phsym.map(p => (
<li className="dictBing-PhsymItem" key={p.lang + p.pron}>
{p.lang} <Speaker src={p.pron} />
</li>
))}
</ul>
)}
{result.cdef && (
<ul className="dictBing-Cdef">
{result.cdef.map(d => (
<li className="dictBing-CdefItem" key={d.pos}>
<span className="dictBing-CdefItem_Pos">{d.pos}</span>
<span className="dictBing-CdefItem_Def">{d.def}</span>
</li>
))}
</ul>
)}
{result.infs && (
<ul className="dictBing-Inf">
词形:
{result.infs.map(inf => (
<li className="dictBing-InfItem" key={inf}>
{inf}
</li>
))}
</ul>
)}
{result.sentences && (
<ol className="dictBing-SentenceList">
{result.sentences.map(sen => (
<li className="dictBing-SentenceItem" key={sen.en}>
{sen.en && (
<p>
<StrElm tag="span" html={sen.en} />
<Speaker src={sen.mp3}></Speaker>
</p>
)}
{sen.chs && <StrElm tag="p" html={sen.chs} />}
{sen.source && (
<footer className="dictBing-SentenceSource">
{sen.source}
</footer>
)}
</li>
))}
</ol>
)}
</>
)
}
function renderMachine(result: BingResultMachine) {
return <p>{result.mt}</p>
}
function renderRelated(result: BingResultRelated) {
return (
<>
<h1 className="dictBing-Related_Title">{result.title}</h1>
{result.defs.map(def => (
<React.Fragment key={def.title}>
<h2 className="dictBing-Related_Title">{def.title}</h2>
<ul>
{def.meanings.map(meaning => (
<li className="dictBing-Related_Meaning" key={meaning.word}>
<a
className="dictBing-Related_Meaning_Word"
href={meaning.href}
>
{meaning.word}
</a>
<span className="dictBing-Related_Meaning_Def">
{meaning.def}
</span>
</li>
))}
</ul>
</React.Fragment>
))}
</>
)
}