From bebc304ef84af54757cbde350e78d63237491ac0 Mon Sep 17 00:00:00 2001 From: Steffen Wolf Date: Mon, 6 May 2024 14:14:04 +0200 Subject: [PATCH] Introduce clean_media function in class openxml_document and use it in remove_slide function --- R/openxml_document.R | 24 +++++++++++++++++++++++- R/ppt_classes.R | 1 + 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/R/openxml_document.R b/R/openxml_document.R index 2121965f..7954ba89 100644 --- a/R/openxml_document.R +++ b/R/openxml_document.R @@ -54,8 +54,30 @@ openxml_document <- R6Class( }, relationship = function(){ private$rels_doc - } + }, + clean_media = function() { + # get package directory + package_dir <- dirname(dirname(dirname(private$rels_filename))) + # find .xml.rels files + rel_files <- list.files(package_dir, pattern = "\\.xml.rels$", recursive = TRUE, full.names = TRUE) + + # collect media files that are referenced in .xml.rels files + media_file_rels <- lapply(rel_files, function(xml){ + zz <- xml2::read_xml(xml) + rels <- xml2::xml_children(zz) + targets <- xml2::xml_attr(rels, "Target") + grep("^\\.\\./media/", targets, value = TRUE) + }) + media_file_rels <- file.path(dirname(dirname(private$rels_filename)), sub("\\.\\./", "", unique(unlist(media_file_rels)))) + # get files in media folder + media_folder <- grep("/media$", list.dirs(package_dir), value = TRUE) + media_files <- list.files(media_folder, recursive = TRUE, full.names = TRUE) + + # delete unused files + files_to_delete <- media_files[!(media_files %in% media_file_rels)] + unlink(files_to_delete, force = TRUE) + } ), private = list( diff --git a/R/ppt_classes.R b/R/ppt_classes.R index 3753ac79..b1084745 100644 --- a/R/ppt_classes.R +++ b/R/ppt_classes.R @@ -79,6 +79,7 @@ presentation <- R6Class( private$slide_rid <- private$slide_rid[-dropid] private$update_xml() + self$clean_media() self }