From 92b60696540edfc7aac532511b6e2c9ef08e8f6c Mon Sep 17 00:00:00 2001 From: tarsin Date: Wed, 14 Jun 2023 11:36:36 +0800 Subject: [PATCH] Cleanup rust parser --- .../ehviewer/client/parser/HomeParser.kt | 1 - app/src/main/rust/src/lib.rs | 25 ++++++++++--------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/com/hippo/ehviewer/client/parser/HomeParser.kt b/app/src/main/java/com/hippo/ehviewer/client/parser/HomeParser.kt index 79b343e18..705923b5a 100644 --- a/app/src/main/java/com/hippo/ehviewer/client/parser/HomeParser.kt +++ b/app/src/main/java/com/hippo/ehviewer/client/parser/HomeParser.kt @@ -10,7 +10,6 @@ object HomeParser { fun parse(body: String): Limits { val value = parseLimit(body) - check(value.size == 3) if (value[0] == -1) throw ParseException("Parse image limits error", body) return Limits(value[0], value[1], value[2]) } diff --git a/app/src/main/rust/src/lib.rs b/app/src/main/rust/src/lib.rs index 21fe20e49..c82859436 100644 --- a/app/src/main/rust/src/lib.rs +++ b/app/src/main/rust/src/lib.rs @@ -1,26 +1,27 @@ extern crate jni; +extern crate tl; use jni::JNIEnv; use jni::objects::{JClass, JString}; use jni::sys::jintArray; +use tl::{Parser, VDom}; -fn parse_limit(body: &str) -> Option> { - let dom = tl::parse(body, tl::ParserOptions::default()).ok()?; +fn parse_jni_string(env: &mut JNIEnv, str: &JString, mut f: F) -> Option + where F: FnMut(&VDom, &Parser) -> Option { + let html = env.get_string(str).ok()?; + let dom = tl::parse(html.to_str().ok()?, tl::ParserOptions::default()).ok()?; let parser = dom.parser(); - let home_box = dom.query_selector("div.homebox")?.next()?.get(parser)?; - let html2 = home_box.inner_html(parser); - let dom2 = tl::parse(&*html2, tl::ParserOptions::default()).ok()?; - let parser = dom2.parser(); - let iter = dom2.query_selector("strong")?; - let vec: Vec = iter.filter_map(|e| Some(e.get(parser)?.inner_text(parser).parse::().ok()?)).collect(); - Some(vec) + Some(f(&dom, parser)?) } #[no_mangle] pub extern "system" fn Java_com_hippo_ehviewer_client_parser_HomeParserKt_parseLimit<'local>(mut env: JNIEnv<'local>, _class: JClass<'local>, input: JString<'local>) -> jintArray { - let html = env.get_string(input.as_ref()).unwrap(); - let vec = parse_limit(html.to_str().unwrap()); + let vec = parse_jni_string(&mut env, &input, |dom, parser| { + let iter = dom.query_selector("strong")?; + let vec: Vec = iter.filter_map(|e| Some(e.get(parser)?.inner_text(parser).parse::().ok()?)).collect(); + if vec.len() == 3 { Some(vec) } else { None } + }).unwrap_or(vec![-1, -1, -1]); let jir = env.new_int_array(3).unwrap(); - env.set_int_array_region(&jir, 0, vec.unwrap_or(vec![-1, -1, -1]).as_ref()).unwrap(); + env.set_int_array_region(&jir, 0, &vec).unwrap(); jir.into_raw() }