From 0ca5572684b6b07422f97ae0230e91cc3bf7d171 Mon Sep 17 00:00:00 2001 From: tarsin Date: Wed, 14 Jun 2023 16:29:39 +0800 Subject: [PATCH] Do rustfmt, unescape xml --- app/src/main/rust/Cargo.toml | 1 + app/src/main/rust/src/lib.rs | 119 ++++++++++++++++++++++++++--------- 2 files changed, 89 insertions(+), 31 deletions(-) diff --git a/app/src/main/rust/Cargo.toml b/app/src/main/rust/Cargo.toml index 47ebe84fa..0eca51dc3 100644 --- a/app/src/main/rust/Cargo.toml +++ b/app/src/main/rust/Cargo.toml @@ -13,3 +13,4 @@ android_logger = "*" apply = "*" regex = "*" once_cell = "*" +quick-xml = "*" diff --git a/app/src/main/rust/src/lib.rs b/app/src/main/rust/src/lib.rs index 6ec6a3dd8..bbf6ebd15 100644 --- a/app/src/main/rust/src/lib.rs +++ b/app/src/main/rust/src/lib.rs @@ -3,6 +3,7 @@ extern crate apply; extern crate jni; extern crate log; extern crate once_cell; +extern crate quick_xml; extern crate regex; extern crate tl; @@ -10,17 +11,22 @@ use std::ffi::c_void; use android_logger::Config; use apply::Also; -use jni::JNIEnv; use jni::objects::{JClass, JList, JObject, JObjectArray, JString}; -use jni::sys::{JavaVM, jint, jintArray, JNI_VERSION_1_6}; +use jni::sys::{jint, jintArray, JavaVM, JNI_VERSION_1_6}; +use jni::JNIEnv; use once_cell::sync::Lazy; +use quick_xml::escape::unescape; use regex::Regex; use tl::{Parser, VDom}; -static TORRENT_REGEX: Lazy = Lazy::new(|| { Regex::new(" ([0-9-]+) [0-9:]+[\\s\\S]+ ([0-9.]+ [KMGT]B)[\\s\\S]+ ([0-9]+)[\\s\\S]+ ([0-9]+)[\\s\\S]+ ([0-9]+)[\\s\\S]+([^<]+)[\\s\\S]+onclick=\"document.location='([^\"]+)'[^<]+>([^<]+)").unwrap() }); +static TORRENT_REGEX: Lazy = Lazy::new(|| { + Regex::new(" ([0-9-]+) [0-9:]+[\\s\\S]+ ([0-9.]+ [KMGT]B)[\\s\\S]+ ([0-9]+)[\\s\\S]+ ([0-9]+)[\\s\\S]+ ([0-9]+)[\\s\\S]+([^<]+)[\\s\\S]+onclick=\"document.location='([^\"]+)'[^<]+>([^<]+)").unwrap() +}); fn parse_jni_string(env: &mut JNIEnv, str: &JString, mut f: F) -> Option - where F: FnMut(&VDom, &Parser, &mut JNIEnv) -> Option { +where + F: FnMut(&VDom, &Parser, &mut JNIEnv) -> Option, +{ let html = env.get_string(str).ok()?; let dom = tl::parse(html.to_str().ok()?, tl::ParserOptions::default()).ok()?; let parser = dom.parser(); @@ -28,46 +34,97 @@ fn parse_jni_string(env: &mut JNIEnv, str: &JString, mut f: F) -> Option jintArray { +pub extern "system" fn Java_com_hippo_ehviewer_client_parser_HomeParserKt_parseLimit( + mut env: JNIEnv, + _class: JClass, + input: JString, +) -> jintArray { let vec = parse_jni_string(&mut env, &input, |dom, parser, _env| { 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![]); - env.new_int_array(3).unwrap().also(|it| env.set_int_array_region(&it, 0, &vec).unwrap()).into_raw() + 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![]); + env.new_int_array(3) + .unwrap() + .also(|it| env.set_int_array_region(&it, 0, &vec).unwrap()) + .into_raw() } #[no_mangle] -pub extern "system" fn Java_com_hippo_ehviewer_client_parser_FavoritesParserKt_parseFav(mut env: JNIEnv, _class: JClass, input: JString, str: JObjectArray) -> jintArray { +pub extern "system" fn Java_com_hippo_ehviewer_client_parser_FavoritesParserKt_parseFav( + mut env: JNIEnv, + _class: JClass, + input: JString, + str: JObjectArray, +) -> jintArray { let vec = parse_jni_string(&mut env, &input, |dom, parser, env| { let fp = dom.get_elements_by_class_name("fp"); - let vec: Vec = fp.enumerate().filter_map(|(i, e)| { - if i == 10 { return None; } - let top = e.get(parser)?.children()?; - let children = top.top(); - let cat = children[5].get(parser)?.inner_text(parser); - env.set_object_array_element(&str, i as i32, env.new_string(cat.trim()).ok()?).ok()?; - Some(children[1].get(parser)?.inner_text(parser).parse::().ok()?) - }).collect(); - if vec.len() == 10 { Some(vec) } else { None } - }).unwrap_or(vec![]); - env.new_int_array(10).unwrap().also(|it| env.set_int_array_region(&it, 0, &vec).unwrap()).into_raw() + let vec: Vec = fp + .enumerate() + .filter_map(|(i, e)| { + if i == 10 { + return None; + } + let top = e.get(parser)?.children()?; + let children = top.top(); + let cat = children[5].get(parser)?.inner_text(parser); + env.set_object_array_element(&str, i as i32, env.new_string(cat.trim()).ok()?) + .ok()?; + Some( + children[1] + .get(parser)? + .inner_text(parser) + .parse::() + .ok()?, + ) + }) + .collect(); + if vec.len() == 10 { + Some(vec) + } else { + None + } + }) + .unwrap_or(vec![]); + env.new_int_array(10) + .unwrap() + .also(|it| env.set_int_array_region(&it, 0, &vec).unwrap()) + .into_raw() } #[no_mangle] -pub extern "system" fn Java_com_hippo_ehviewer_client_parser_TorrentParserKt_parseTorrent(mut env: JNIEnv, _class: JClass, input: JString, list: JObject) { +pub extern "system" fn Java_com_hippo_ehviewer_client_parser_TorrentParserKt_parseTorrent( + mut env: JNIEnv, + _class: JClass, + input: JString, + list: JObject, +) { let list = JList::from_env(&mut env, &list).unwrap(); let string = env.find_class("java/lang/String").unwrap(); parse_jni_string(&mut env, &input, |dom, parser, env| { - let _: Vec = dom.query_selector("table")?.filter_map(|e| { - let array = env.new_object_array(7, &string, JObject::null()).ok()?; - let html = e.get(parser)?.inner_html(parser); - let grp = TORRENT_REGEX.captures(&html)?; - let vec = vec![&grp[1], &grp[2], &grp[3], &grp[4], &grp[5], &grp[7], &grp[8]]; - vec.iter().enumerate().for_each(|(i, &n)| { env.set_object_array_element(&array, i as i32, env.new_string(n).unwrap()).unwrap(); }); - list.add(env, &array).ok()?; - None - }).collect(); + let _: Vec = dom + .query_selector("table")? + .filter_map(|e| { + let array = env.new_object_array(7, &string, JObject::null()).ok()?; + let html = e.get(parser)?.inner_html(parser); + let grp = TORRENT_REGEX.captures(&html)?; + let name = unescape(&grp[8]).ok()?; + let vec = vec![&grp[1], &grp[2], &grp[3], &grp[4], &grp[5], &grp[7], &name]; + vec.iter().enumerate().for_each(|(i, &n)| { + env.set_object_array_element(&array, i as i32, env.new_string(n).unwrap()) + .unwrap(); + }); + list.add(env, &array).ok()?; + None + }) + .collect(); Some(0) }); }