diff --git a/docs/content.en/docs/release-notes/_index.md b/docs/content.en/docs/release-notes/_index.md index d83c741f..a0680c94 100644 --- a/docs/content.en/docs/release-notes/_index.md +++ b/docs/content.en/docs/release-notes/_index.md @@ -39,6 +39,8 @@ refactor(calculator): skip evaluation if expr is in form "num => num" #929 chore: use a custom log directory #930 chore: bump tauri_nspanel to v2.1 #933 refactor: show_coco/hide_coco now use NSPanel's function on macOS #933 +refactor: procedure that convert_pages() into a func #934 + ## 0.8.0 (2025-09-28) diff --git a/src-tauri/src/extension/third_party/install/local_extension.rs b/src-tauri/src/extension/third_party/install/local_extension.rs index 3263a8a5..b488c2d0 100644 --- a/src-tauri/src/extension/third_party/install/local_extension.rs +++ b/src-tauri/src/extension/third_party/install/local_extension.rs @@ -1,6 +1,7 @@ +use crate::extension::PLUGIN_JSON_FILE_NAME; use crate::extension::third_party::check::general_check; use crate::extension::third_party::install::{ - convert_page, filter_out_incompatible_sub_extensions, is_extension_installed, + filter_out_incompatible_sub_extensions, is_extension_installed, view_extension_convert_pages, }; use crate::extension::third_party::{ THIRD_PARTY_EXTENSIONS_SEARCH_SOURCE, get_third_party_extension_directory, @@ -8,7 +9,6 @@ use crate::extension::third_party::{ use crate::extension::{ Extension, canonicalize_relative_icon_path, canonicalize_relative_page_path, }; -use crate::extension::{ExtensionType, PLUGIN_JSON_FILE_NAME}; use crate::util::platform::Platform; use serde_json::Value as Json; use std::path::Path; @@ -227,55 +227,7 @@ pub(crate) async fn install_local_extension( * * HTTP links will be skipped. */ - let pages: Vec<&str> = { - if extension.r#type == ExtensionType::View { - let page = extension - .page - .as_ref() - .expect("View extension should set its page field"); - - vec![page.as_str()] - } else if extension.r#type.contains_sub_items() - && let Some(ref views) = extension.views - { - let mut pages = Vec::with_capacity(views.len()); - - for view in views.iter() { - let page = view - .page - .as_ref() - .expect("View extension should set its page field"); - - pages.push(page.as_str()); - } - - pages - } else { - // No pages in this extension - Vec::new() - } - }; - fn canonicalize_page_path(page_path: &Path, extension_root: &Path) -> PathBuf { - if page_path.is_relative() { - // It is relative to the extension root directory - extension_root.join(page_path) - } else { - page_path.into() - } - } - for page in pages { - /* - * Skip HTTP links - */ - if let Ok(url) = url::Url::parse(page) - && ["http", "https"].contains(&url.scheme()) - { - continue; - } - - let path = canonicalize_page_path(Path::new(page), &dest_dir); - convert_page(&path).await?; - } + view_extension_convert_pages(&extension, &dest_dir).await?; // Canonicalize relative icon and page paths canonicalize_relative_icon_path(&dest_dir, &mut extension)?; diff --git a/src-tauri/src/extension/third_party/install/mod.rs b/src-tauri/src/extension/third_party/install/mod.rs index 4573dae1..99637e75 100644 --- a/src-tauri/src/extension/third_party/install/mod.rs +++ b/src-tauri/src/extension/third_party/install/mod.rs @@ -42,8 +42,10 @@ pub(crate) mod local_extension; pub(crate) mod store; use crate::extension::Extension; +use crate::extension::ExtensionType; use crate::util::platform::Platform; use std::path::Path; +use std::path::PathBuf; use super::THIRD_PARTY_EXTENSIONS_SEARCH_SOURCE; @@ -228,6 +230,63 @@ fn _convert_page(page_content: &str, absolute_page_path: &Path) -> Result Result<(), String> { + let pages: Vec<&str> = { + if extension.r#type == ExtensionType::View { + let page = extension + .page + .as_ref() + .expect("View extension should set its page field"); + + vec![page.as_str()] + } else if extension.r#type.contains_sub_items() + && let Some(ref views) = extension.views + { + let mut pages = Vec::with_capacity(views.len()); + + for view in views.iter() { + let page = view + .page + .as_ref() + .expect("View extension should set its page field"); + + pages.push(page.as_str()); + } + + pages + } else { + // No pages in this extension + Vec::new() + } + }; + fn canonicalize_page_path(page_path: &Path, extension_root: &Path) -> PathBuf { + if page_path.is_relative() { + // It is relative to the extension root directory + extension_root.join(page_path) + } else { + page_path.into() + } + } + for page in pages { + /* + * Skip HTTP links + */ + if let Ok(url) = url::Url::parse(page) + && ["http", "https"].contains(&url.scheme()) + { + continue; + } + + let path = canonicalize_page_path(Path::new(page), &extension_directory); + convert_page(&path).await?; + } + + Ok(()) +} + #[cfg(test)] mod tests { use super::*; diff --git a/src-tauri/src/extension/third_party/install/store.rs b/src-tauri/src/extension/third_party/install/store.rs index 555f83c7..9a6c98e7 100644 --- a/src-tauri/src/extension/third_party/install/store.rs +++ b/src-tauri/src/extension/third_party/install/store.rs @@ -10,15 +10,14 @@ use crate::common::search::QuerySource; use crate::common::search::SearchQuery; use crate::common::traits::SearchSource; use crate::extension::Extension; -use crate::extension::ExtensionType; use crate::extension::PLUGIN_JSON_FILE_NAME; use crate::extension::THIRD_PARTY_EXTENSIONS_SEARCH_SOURCE; use crate::extension::canonicalize_relative_icon_path; use crate::extension::canonicalize_relative_page_path; use crate::extension::third_party::check::general_check; use crate::extension::third_party::get_third_party_extension_directory; -use crate::extension::third_party::install::convert_page; use crate::extension::third_party::install::filter_out_incompatible_sub_extensions; +use crate::extension::third_party::install::view_extension_convert_pages; use crate::server::http_client::HttpClient; use crate::util::platform::Platform; use async_trait::async_trait; @@ -26,8 +25,6 @@ use reqwest::StatusCode; use serde_json::Map as JsonObject; use serde_json::Value as Json; use std::io::Read; -use std::path::Path; -use std::path::PathBuf; use tauri::AppHandle; const DATA_SOURCE_ID: &str = "Extension Store"; @@ -401,57 +398,11 @@ pub(crate) async fn install_extension_from_store( /* * Call convert_page() to update the page files. This has to be done after - * writing the extension files + * writing the extension files because we will edit them. + * + * HTTP links will be skipped. */ - let pages: Vec<&str> = { - if extension.r#type == ExtensionType::View { - let page = extension - .page - .as_ref() - .expect("View extension should set its page field"); - - vec![path.as_str()] - } else if extension.r#type.contains_sub_items() - && let Some(ref views) = extension.views - { - let mut pages = Vec::with_capacity(views.len()); - - for view in views.iter() { - let page = view - .page - .as_ref() - .expect("View extension should set its page field"); - - pages.push(page.as_str()); - } - - pages - } else { - // No pages in this extension - Vec::new() - } - }; - fn canonicalize_page_path(page_path: &Path, extension_root: &Path) -> PathBuf { - if page_path.is_relative() { - // It is relative to the extension root directory - extension_root.join(page_path) - } else { - page_path.into() - } - } - for page in pages { - /* - * Skip HTTP links - */ - if let Ok(url) = url::Url::parse(page) - && ["http", "https"].contains(&url.scheme()) - { - continue; - } - - let path = canonicalize_page_path(Path::new(page), &extension_directory); - convert_page(&path).await?; - } + view_extension_convert_pages(&extension, &extension_directory).await?; // Canonicalize relative icon and page paths canonicalize_relative_icon_path(&extension_directory, &mut extension)?;