Skip to content

Commit ae5bf8d

Browse files
authored
Merge pull request #29 from Guanran928/staging
Staging
2 parents 3dfcbab + 652ee64 commit ae5bf8d

File tree

7 files changed

+54
-53
lines changed

7 files changed

+54
-53
lines changed

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

flake.lock

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.nix

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,17 @@
11
{ lib, rustPlatform }:
2+
let
3+
cargoHash = "sha256-kTmN33oFodggtIwZo1Ex4slRSfYoYVOl7JVWxouVNOI=";
4+
in
25
rec {
36
default = rdict;
47
rdict = rustPlatform.buildRustPackage {
8+
inherit cargoHash;
9+
510
pname = "rdict";
611
version = "0.1.0";
712

813
src = lib.cleanSource ./.;
914

10-
useFetchCargoVendor = true;
11-
cargoHash = "sha256-Oi1N29W7PzO4qucJ9ggTH/tLT6Tvd5Yx5+P1UwaIN4w=";
12-
1315
buildAndTestSubdir = "./rdict-cli";
1416

1517
preCheck = ''
@@ -23,14 +25,13 @@ rec {
2325
};
2426

2527
rdict-telegram = rustPlatform.buildRustPackage {
28+
inherit cargoHash;
29+
2630
pname = "rdict-telegram";
2731
version = "0.1.0";
2832

2933
src = lib.cleanSource ./.;
3034

31-
useFetchCargoVendor = true;
32-
cargoHash = "sha256-Oi1N29W7PzO4qucJ9ggTH/tLT6Tvd5Yx5+P1UwaIN4w=";
33-
3435
buildAndTestSubdir = "./rdict-telegram";
3536

3637
preCheck = ''

rdict-cli/src/main.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -172,10 +172,10 @@ impl App {
172172
let indented_output = format!("\n{indented_output}\n");
173173

174174
// If window is too small, output the result in a pager
175-
let size =
176-
crossterm::terminal::window_size().context("Failed to get terminal size")?;
175+
let (_, height) =
176+
crossterm::terminal::size().context("Failed to get terminal size")?;
177177
// NOTE: Removed 4 lines for shell prompt.
178-
if size.rows - 4 < indented_output.lines().count() as u16 {
178+
if height - 4 < indented_output.lines().count() as u16 {
179179
let mut terminal = ratatui::init();
180180
(pager::Pager {
181181
text: indented_output,

rdict-core/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ serde_json = "1.0.140"
2323
tokio = { version = "1", features = ["macros", "rt-multi-thread"] }
2424
sqlx = { version = "0.8.6", features = ["sqlite", "runtime-tokio"] }
2525
log = "0.4.27"
26+
once_cell = "1.21.3"
2627

2728
[dev-dependencies]
2829
assert_cmd = "2.0.17"

rdict-core/src/parse.rs

Lines changed: 37 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use anyhow::{Result, ensure};
2+
use once_cell::sync::Lazy;
23
use scraper::{Html, Selector};
34
use serde::{Deserialize, Serialize};
45

@@ -45,6 +46,26 @@ pub enum TranslationData {
4546
ToEnglish(ToEnglish),
4647
}
4748

49+
macro_rules! selector {
50+
($css:expr) => {
51+
Lazy::new(|| Selector::parse($css).expect(concat!("Invalid selector: ", $css)))
52+
};
53+
}
54+
55+
#[rustfmt::skip]
56+
mod selectors {
57+
use super::*;
58+
59+
pub static PRONUNCIATION_SELECTOR: Lazy<Selector> = selector!(".phone_con .per-phone .phonetic");
60+
pub static MEANINGS_SELECTOR: Lazy<Selector> = selector!(".trans-container .basic .word-exp");
61+
pub static DEFINITIONS_SELECTOR: Lazy<Selector> = selector!(".trans");
62+
pub static PART_OF_SPEECH_SELECTOR: Lazy<Selector> = selector!(".pos");
63+
pub static EXAMPLE_SELECTOR: Lazy<Selector> = selector!(".trans-container .mcols-layout .col2");
64+
pub static EN_SELECTOR: Lazy<Selector> = selector!(".sen-eng");
65+
pub static ZH_SELECTOR: Lazy<Selector> = selector!(".sen-ch");
66+
pub static TO_ENGLISH_TRANSLATION_SELECTOR: Lazy<Selector> = selector!(".trans-container .basic .col2 .point");
67+
}
68+
4869
/// Parses English, returns Chinese
4970
///
5071
/// # Errors
@@ -59,11 +80,11 @@ pub fn to_chinese(input_text: &str, html: &str) -> Result<ToChinese> {
5980
..Default::default()
6081
};
6182

62-
// Pronunciation
63-
let pronunciation_selector = Selector::parse(".phone_con .per-phone .phonetic")
64-
.map_err(|e| anyhow::anyhow!("Selector parse error: {}", e))?;
65-
66-
for (i, element) in document.select(&pronunciation_selector).take(2).enumerate() {
83+
for (i, element) in document
84+
.select(&selectors::PRONUNCIATION_SELECTOR)
85+
.take(2)
86+
.enumerate()
87+
{
6788
let text = element
6889
.text()
6990
.collect::<String>()
@@ -80,22 +101,14 @@ pub fn to_chinese(input_text: &str, html: &str) -> Result<ToChinese> {
80101
}
81102
}
82103

83-
// Translations
84-
let meanings_selector = Selector::parse(".trans-container .basic .word-exp")
85-
.map_err(|e| anyhow::anyhow!("Selector parse error: {}", e))?;
86-
let definitions_selector =
87-
Selector::parse(".trans").map_err(|e| anyhow::anyhow!("Selector parse error: {}", e))?;
88-
let part_of_speech_selector =
89-
Selector::parse(".pos").map_err(|e| anyhow::anyhow!("Selector parse error: {}", e))?;
90-
91-
for element in document.select(&meanings_selector) {
104+
for element in document.select(&selectors::MEANINGS_SELECTOR) {
92105
let part_of_speech = element
93-
.select(&part_of_speech_selector)
106+
.select(&selectors::PART_OF_SPEECH_SELECTOR)
94107
.next()
95108
.map(|e| e.text().collect::<String>().trim().to_owned());
96109

97110
let definitions: Vec<String> = element
98-
.select(&definitions_selector)
111+
.select(&selectors::DEFINITIONS_SELECTOR)
99112
.next()
100113
.map(|e| {
101114
e.text()
@@ -116,22 +129,15 @@ pub fn to_chinese(input_text: &str, html: &str) -> Result<ToChinese> {
116129
}
117130

118131
// Example sentences
119-
let example_selector = Selector::parse(".trans-container .mcols-layout .col2")
120-
.map_err(|e| anyhow::anyhow!("Selector parse error: {}", e))?;
121-
let en_selector =
122-
Selector::parse(".sen-eng").map_err(|e| anyhow::anyhow!("Selector parse error: {}", e))?;
123-
let zh_selector =
124-
Selector::parse(".sen-ch").map_err(|e| anyhow::anyhow!("Selector parse error: {}", e))?;
125-
126-
for element in document.select(&example_selector) {
132+
for element in document.select(&selectors::EXAMPLE_SELECTOR) {
127133
let en = element
128-
.select(&en_selector)
134+
.select(&selectors::EN_SELECTOR)
129135
.next()
130136
.map(|e| e.text().collect::<String>().trim().to_owned())
131137
.unwrap_or_default();
132138

133139
let zh = element
134-
.select(&zh_selector)
140+
.select(&selectors::ZH_SELECTOR)
135141
.next()
136142
.map(|e| e.text().collect::<String>().trim().to_owned())
137143
.unwrap_or_default();
@@ -167,32 +173,24 @@ pub fn to_english(input_text: &str, html: &str) -> Result<ToEnglish> {
167173
};
168174

169175
// Meanings
170-
let translation_selector = Selector::parse(".trans-container .basic .col2 .point")
171-
.map_err(|e| anyhow::anyhow!("Selector parse error: {}", e))?;
172-
for element in document.select(&translation_selector) {
176+
for element in document.select(&selectors::TO_ENGLISH_TRANSLATION_SELECTOR) {
173177
let text = element.text().collect::<String>().trim().to_owned();
174178
if !text.is_empty() {
175179
result.meanings.push(text);
176180
}
177181
}
178182

179183
// Example sentences
180-
let example_selector = Selector::parse(".trans-container .mcols-layout .col2")
181-
.map_err(|e| anyhow::anyhow!("Selector parse error: {}", e))?;
182-
let en_selector =
183-
Selector::parse(".sen-eng").map_err(|e| anyhow::anyhow!("Selector parse error: {}", e))?;
184-
let zh_selector =
185-
Selector::parse(".sen-ch").map_err(|e| anyhow::anyhow!("Selector parse error: {}", e))?;
186-
187-
for element in document.select(&example_selector) {
184+
185+
for element in document.select(&selectors::EXAMPLE_SELECTOR) {
188186
let en = element
189-
.select(&en_selector)
187+
.select(&selectors::EN_SELECTOR)
190188
.next()
191189
.map(|el| el.text().collect::<String>().trim().to_owned())
192190
.unwrap_or_default();
193191

194192
let zh = element
195-
.select(&zh_selector)
193+
.select(&selectors::ZH_SELECTOR)
196194
.next()
197195
.map(|el| el.text().collect::<String>().trim().to_owned())
198196
.unwrap_or_default();

rdict-telegram/src/main.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,10 +83,10 @@ async fn handle_command(bot: Bot, msg: Message, cmd: Command, client: Arc<Rdict>
8383

8484
// TODO: Use `Dispatcher`'s `handle_error`.
8585
if let Err(e) = res {
86-
log::error!("{e:?}");
86+
log::error!("{e}");
8787
bot.send_message(
8888
msg.chat.id,
89-
format!("❌ An error occurred. Please try again later.\n\nErr: {e}"),
89+
format!("❌ An error occurred. Please try again later.\n\n{e:?}"),
9090
)
9191
.await
9292
.ok();

0 commit comments

Comments
 (0)