diff --git a/lib/data/atlas/client/client.v b/lib/data/atlas/client/client.v index 9d9966a3..155754d0 100644 --- a/lib/data/atlas/client/client.v +++ b/lib/data/atlas/client/client.v @@ -93,7 +93,7 @@ pub fn (mut c AtlasClient) get_file_path(collection_name string, file_name strin } // Construct the file path - file_path := os.join_path(c.export_dir, 'content', 'files', fixed_collection_name, + file_path := os.join_path(c.export_dir, 'content', fixed_collection_name, 'files', fixed_file_name) // Check if the file exists @@ -121,7 +121,7 @@ pub fn (mut c AtlasClient) get_image_path(collection_name string, image_name str } // Construct the image path - image_path := os.join_path(c.export_dir, 'content', 'img', fixed_collection_name, + image_path := os.join_path(c.export_dir, 'content', fixed_collection_name, 'img', fixed_image_name) // Check if the image exists @@ -214,85 +214,26 @@ pub fn (mut c AtlasClient) list_pages(collection_name string) ![]string { // list_files returns a list of all file names in a collection (excluding pages and images) pub fn (mut c AtlasClient) list_files(collection_name string) ![]string { - // Apply name normalization - fixed_collection_name := texttools.name_fix(collection_name) - - collection_dir := os.join_path(c.export_dir, 'content', fixed_collection_name) - - // Check if collection directory exists - if !os.exists(collection_dir) { - return c.error_collection_not_found(collection_name: collection_name) - } - - // Get all files that are not .md and not images + metadata := c.get_collection_metadata(collection_name)! mut file_names := []string{} - entries := os.ls(collection_dir)! - - for entry in entries { - entry_path := os.join_path(collection_dir, entry) - - // Skip directories - if os.is_dir(entry_path) { - continue - } - - // Skip .md files (pages) - if entry.ends_with('.md') { - continue - } - - // Check if it's an image - mut is_image := false - for ext in image_extensions { - if entry.ends_with(ext) { - is_image = true - break - } - } - - // Add to file_names if it's not an image - if !is_image { - file_names << entry + for file_name, file_meta in metadata.files { + if !file_meta.path.starts_with('img/') { // Exclude images + file_names << file_name } } - return file_names } // list_images returns a list of all image names in a collection pub fn (mut c AtlasClient) list_images(collection_name string) ![]string { - // Apply name normalization - fixed_collection_name := texttools.name_fix(collection_name) - - collection_dir := os.join_path(c.export_dir, 'content', fixed_collection_name) - - // Check if collection directory exists - if !os.exists(collection_dir) { - return c.error_collection_not_found(collection_name: collection_name) - } - - // Get all image files - mut image_names := []string{} - entries := os.ls(collection_dir)! - - for entry in entries { - entry_path := os.join_path(collection_dir, entry) - - // Skip directories - if os.is_dir(entry_path) { - continue - } - - // Check if it's an image - for ext in image_extensions { - if entry.ends_with(ext) { - image_names << entry - break - } + metadata := c.get_collection_metadata(collection_name)! + mut images := []string{} + for file_name, file_meta in metadata.files { + if file_meta.path.starts_with('img/') { + images << file_name } } - - return image_names + return images } // list_pages_map returns a map of collection names to a list of page names within that collection. @@ -390,47 +331,20 @@ pub fn (mut c AtlasClient) has_errors(collection_name string) bool { return errors.len > 0 } -// get_page_paths returns the path of a page and the paths of its linked images. -// Returns (page_path, image_paths) -// This is compatible with the doctreeclient API -// pub fn (mut c AtlasClient) get_page_paths(collection_name string, page_name string) !(string, []string) { -// // Get the page path -// page_path := c.get_page_path(collection_name, page_name)! -// page_content := c.get_page_content(collection_name, page_name)! - -// // Extract image names from the page content -// image_names := extract_image_links(page_content, true)! - -// mut image_paths := []string{} -// for image_name in image_names { -// // Get the path for each image -// image_path := c.get_image_path(collection_name, image_name) or { -// // If an image is not found, log a warning and continue, don't fail the whole operation -// return error('Error: Linked image "${image_name}" not found in collection "${collection_name}". Skipping.') -// } -// image_paths << image_path -// } - -// return page_path, image_paths -// } - -// copy_images copies all images linked in a page to a destination directory -// This is compatible with the doctreeclient API -// pub fn (mut c AtlasClient) copy_images(collection_name string, page_name string, destination_path string) ! { -// // Get the page path and linked image paths -// _, image_paths := c.get_page_paths(collection_name, page_name)! - -// // Ensure the destination directory exists -// os.mkdir_all(destination_path)! - -// // Create an 'img' subdirectory within the destination -// images_dest_path := os.join_path(destination_path, 'img') -// os.mkdir_all(images_dest_path)! - -// // Copy each linked image -// for image_path in image_paths { -// image_file_name := os.base(image_path) -// dest_image_path := os.join_path(images_dest_path, image_file_name) -// os.cp(image_path, dest_image_path)! -// } -// } +pub fn (mut c AtlasClient) copy_images(collection_name string, page_name string, destination_path string) ! { + // Get page links from metadata + links := c.get_page_links(collection_name, page_name)! + + // Create img subdirectory + mut img_dest := pathlib.get_dir(path: '${destination_path}/img', create: true)! + + // Copy only image links + for link in links { + if !link.is_image_link { continue } + + // Get image path and copy + img_path := c.get_image_path(link.target_collection_name, link.target_item_name)! + mut src := pathlib.get_file(path: img_path)! + src.copy(dest: '${img_dest.path}/${src.name_fix()}.${src.extension_lower()}')! + } +} diff --git a/lib/data/atlas/client/client_test.v b/lib/data/atlas/client/client_test.v index 14f1d29d..2301d1b5 100644 --- a/lib/data/atlas/client/client_test.v +++ b/lib/data/atlas/client/client_test.v @@ -28,15 +28,17 @@ fn setup_test_export() string { '# Intro\n\nWelcome!') or { panic(err) } // Create test images - os.write_file(os.join_path(test_dir, 'content', 'testcollection', 'logo.png'), 'fake png data') or { + os.mkdir_all(os.join_path(test_dir, 'content', 'testcollection', 'img')) or { panic(err) } + os.write_file(os.join_path(test_dir, 'content', 'testcollection', 'img', 'logo.png'), 'fake png data') or { panic(err) } - os.write_file(os.join_path(test_dir, 'content', 'testcollection', 'banner.jpg'), 'fake jpg data') or { + os.write_file(os.join_path(test_dir, 'content', 'testcollection', 'img', 'banner.jpg'), 'fake jpg data') or { panic(err) } // Create test files - os.write_file(os.join_path(test_dir, 'content', 'testcollection', 'data.csv'), 'col1,col2\nval1,val2') or { + os.mkdir_all(os.join_path(test_dir, 'content', 'testcollection', 'files')) or { panic(err) } + os.write_file(os.join_path(test_dir, 'content', 'testcollection', 'files', 'data.csv'), 'col1,col2\nval1,val2') or { panic(err) } @@ -70,7 +72,20 @@ fn setup_test_export() string { ] } }, - "files": {}, + "files": { + "logo.png": { + "name": "logo.png", + "path": "img/logo.png" + }, + "banner.jpg": { + "name": "banner.jpg", + "path": "img/banner.jpg" + }, + "data.csv": { + "name": "data.csv", + "path": "files/data.csv" + } + }, "errors": [] }' os.write_file(os.join_path(test_dir, 'meta', 'testcollection.json'), metadata1) or {