From 182923ad441c5241b63b06073b645d5877b330fb Mon Sep 17 00:00:00 2001 From: Mark Heckmann Date: Sat, 5 Oct 2024 09:20:52 +0200 Subject: [PATCH] Feat: `plot_layout_properties()`: accept index, new legend arg, plot current slide by default - `plot_layout_properties()`: Now prints the current slide's layout by default, if not layout name is provided explicitly (#595). - Accept the layout index (see `layout_summary()`) as alternative to the layout name (suggestion 2 in #595). - `plot_layout_properties()`: Gains arg `legend` to add a legend to plot --- NEWS.md | 5 +- R/pptx_informations.R | 63 +++++++++++------- R/pptx_layout_helper.R | 24 +++++++ R/pptx_slide_manip.R | 21 ++++++ .../examples/example_plot_layout_properties.R | 17 +++++ man/plot_layout_properties.Rd | 26 ++++++-- .../pptx-info/plot-content-order-default.png | Bin 12467 -> 12197 bytes .../plot-content-order-labels-only.png | Bin 8654 -> 8354 bytes ...-titleslide-layout-default-with-legend.png | Bin 0 -> 10558 bytes .../plot-titleslide-layout-default.png | Bin 9751 -> 9450 bytes .../plot-titleslide-layout-labels-only.png | Bin 7158 -> 6850 bytes tests/testthat/test-get-layout-helper.R | 41 ++++++++++++ tests/testthat/test-pptx-info.R | 40 +++++++++-- tests/testthat/test-pptx-selections.R | 22 ++++++ tests/testthat/test-utils.R | 1 - 15 files changed, 220 insertions(+), 40 deletions(-) create mode 100644 inst/examples/example_plot_layout_properties.R create mode 100644 tests/testthat/_snaps/pptx-info/plot-titleslide-layout-default-with-legend.png diff --git a/NEWS.md b/NEWS.md index f2ef4677..e0fea349 100644 --- a/NEWS.md +++ b/NEWS.md @@ -22,7 +22,10 @@ informative error message if the type is not present in layout (#601). - `plot_layout_properties()` plots more information by default now: layout name, ph label, ph id, ph type + index by default (#606). - `ph_location_type()`: new `type_idx` arg replaces the deprecated `id` arg (#606). - Add `ph_location_id()` as a new member to the `ph_location_*` family. It references a placeholder via its unique id (#606). - +- `plot_layout_properties()`: Now accepts the layout index (see `layout_summary()`) as an alternative to the layout name. + Gains an argument `legend` to add a legend to the plot. Also prints the current slide's layout by + default now, if not layout name is provided explicitly (#595). + ## Features - `layout_rename_ph_labels()` to rename ph labels (#610). diff --git a/R/pptx_informations.R b/R/pptx_informations.R index d4b21a34..f3b46956 100644 --- a/R/pptx_informations.R +++ b/R/pptx_informations.R @@ -12,6 +12,7 @@ length.rpptx <- function( x ){ x$slide$length() } + #' @export #' @title Slides width and height #' @description Get the width and height of slides in inches as @@ -32,7 +33,6 @@ slide_size <- function(x) { } - #' @export #' @title Presentation layouts summary #' @description Get information about slide layouts and @@ -118,8 +118,8 @@ layout_properties <- function(x, layout = NULL, master = NULL) { #' _NB_: The id is set by PowerPoint automatically and lack a meaningful order. #' #' @param x an `rpptx` object -#' @param layout slide layout name. -#' @param master master layout name where `layout` is located. +#' @param layout slide layout name or numeric index (row index from [layout_summary()). +#' @param master master layout name where `layout` is located. Can be omitted if layout is unambiguous. #' @param title if `TRUE` (default), adds a title with the layout name at the top. #' @param labels if `TRUE` (default), adds placeholder labels (centered in *red*). #' @param type if `TRUE` (default), adds the placeholder type and its index (in square brackets) @@ -128,21 +128,16 @@ layout_properties <- function(x, layout = NULL, master = NULL) { #' [layout_properties()]) in the upper right corner (in *green*). #' @param cex named list or vector to specify font size for `labels`, `type`, and `id`. Default is #' `c(labels = .5, type = .5, id = .5)`. See [graphics::text()] for details on how `cex` works. +#' @param legend Add a legend to the plot (default `FALSE`). #' @importFrom graphics plot rect text box -#' @examples -#' x <- read_pptx() -#' plot_layout_properties(x = x, layout = "Title Slide", master = "Office Theme") -#' plot_layout_properties(x = x, layout = "Two Content") -#' plot_layout_properties(x = x, layout = "Two Content", title = FALSE, type = FALSE, id = FALSE) -#' -#' # change font size -#' plot_layout_properties(x = x, layout = "Two Content", cex = c(labels = 1, id = .7, type = .7)) -#' #' @family functions for reading presentation information +#' @example inst/examples/example_plot_layout_properties.R #' plot_layout_properties <- function(x, layout = NULL, master = NULL, labels = TRUE, title = TRUE, - type = TRUE, id = TRUE, cex = NULL) { - old_par <- par(mar = c(2, 2, 1.5, 0)) + type = TRUE, id = TRUE, cex = NULL, legend = FALSE) { + stop_if_not_rpptx(x, "x") + loffset <- ifelse(legend, 1, 0) # make space for legend at top + old_par <- par(mar = c(2, 2, 1.5 + loffset, 0)) on.exit(par(old_par)) cex_default <- list(labels = .5, type = .5, id = .5) @@ -155,7 +150,21 @@ plot_layout_properties <- function(x, layout = NULL, master = NULL, labels = TRU } .cex <- utils::modifyList(x = cex_default, val = as.list(cex), keep.null = TRUE) - dat <- layout_properties(x, layout = layout, master = master) + # use current slides layout as default (if layout and master = NULL) + if (is.null(layout) && is.null(master)) { + if (length(x) == 0) { + cli::cli_abort( + c("No {.arg layout} selected and no slides in presentation.", + "x" = "Pass a layout name or index (see {.fn layout_summary})") + ) + } + la <- get_layout_for_current_slide(x) + cli::cli_inform(c("i"="Showing current slide's layout: {.val {la$layout_name}}")) + } else { + la <- get_layout(x, layout, master) + } + + dat <- layout_properties(x, layout = la$layout_name, master = la$master_name) if (length(unique(dat$name)) > 1) { cli::cli_abort(c("One single layout must be chosen", "x" = "Did you supply a master?" @@ -166,9 +175,6 @@ plot_layout_properties <- function(x, layout = NULL, master = NULL, labels = TRU "x" = "Did you misspell the layout name?" ), call = NULL) } - # # order and type_idx now in xfrmize() - # dat <- dat[order(dat$type, as.integer(dat$id)), ] # set order for type idx. Removing the line would result in the default layout properties order, i.e., top->bottom left->right. - # dat$type_idx <- stats::ave(dat$type, dat$type, FUN = seq_along) # NB: returns character index s <- slide_size(x) h <- s$height @@ -179,11 +185,11 @@ plot_layout_properties <- function(x, layout = NULL, master = NULL, labels = TRU plot(x = c(0, w), y = -c(0, h), asp = 1, type = "n", axes = FALSE, xlab = NA, ylab = NA) rect(xleft = 0, xright = w, ybottom = 0, ytop = -h, border = "darkgrey") rect(xleft = offx, xright = offx + cx, ybottom = -offy, ytop = -(offy + cy)) - mtext("y [inch]", side = 2, line = 0, cex = 1.2, col = "darkgrey") - mtext("x [inch]", side = 1, line = 0, cex = 1.2, col = "darkgrey") + mtext("y [inch]", side = 2, line = 0, cex = .9, col = "darkgrey") + mtext("x [inch]", side = 1, line = 0, cex = .9, col = "darkgrey") if (title) { - title(main = paste("Layout:", layout)) + title(main = paste("Layout:", la$layout_name), line = 0 + loffset) } if (labels) { # centered text(x = offx + cx / 2, y = -(offy + cy / 2), labels = dat$ph_label, cex = .cex$labels, col = "red", adj = c(.5, 1)) # adj-vert: avoid interference with type/id in small phs @@ -195,6 +201,16 @@ plot_layout_properties <- function(x, layout = NULL, master = NULL, labels = TRU if (id) { # upper right corner text(x = offx + cx, y = -offy, labels = dat$id, cex = .cex$id, col = "darkgreen", adj = c(1.3, 1.2)) } + if (legend) { + legend(x = w / 2, y = 0, x.intersp = 0.4, xjust = .5, yjust = 0, + legend = c("type [type_idx]", "ph_label", "id"), fill = c("blue", "red", "darkgreen"), + bty = "n", pt.cex = 1.2, cex = .7, text.width = NA, + text.col = c("blue", "red", "darkgreen"), horiz = TRUE, xpd = TRUE + ) + } + + + } @@ -265,6 +281,7 @@ annotate_base <- function(path = NULL, output_file = 'annotated_layout.pptx' ){ ppt } + #' @export #' @title Slide content in a data.frame #' @description Get content and positions of current slide @@ -319,10 +336,6 @@ slide_summary <- function( x, index = NULL ){ } - - - - #' @export #' @title Color scheme of a PowerPoint file #' @description Get the color scheme of a diff --git a/R/pptx_layout_helper.R b/R/pptx_layout_helper.R index 30f3579a..14f8986e 100644 --- a/R/pptx_layout_helper.R +++ b/R/pptx_layout_helper.R @@ -103,3 +103,27 @@ get_row_by_name <- function(df, layout, master) { } df } + + +# get object for slide layout +get_slide_layout <- function(x, slide_idx) { + stop_if_not_rpptx(x) + if (length(x) == 0) { + cli::cli_abort( + c("Presentation does not have any slides yet", + "x" = "Can only get the layout for an existing slides", + "i" = "You can add a slide using {.fn add_slide}") + , call = NULL) + } + ensure_slide_index_exists(x, slide_idx) + df <- x$slide$get_xfrm()[[slide_idx]] + layout <- unique(df$name) + master <- unique(df$master_name) + get_layout(x, layout, master) +} + + +# get object for layout of current slide +get_layout_for_current_slide <- function(x) { + get_slide_layout(x, x$cursor) +} diff --git a/R/pptx_slide_manip.R b/R/pptx_slide_manip.R index 229d31bd..22c6a298 100644 --- a/R/pptx_slide_manip.R +++ b/R/pptx_slide_manip.R @@ -234,3 +234,24 @@ shape_properties_tags <- function(left = 0, top = 0, width = 3, height = 3, sprintf(str, randomid, label, ph, xfrm_str, geom_str, bg_str, ln_str) } + + +# check if slide index exists +ensure_slide_index_exists <- function(x, slide_idx) { + stop_if_not_rpptx(x) + if (!is.numeric(slide_idx)) { + cli::cli_abort( + c("{.arg slide_idx} must be {.cls numeric}", + "x" = "You provided {.cls {class(slide_idx)[1]}} instead.") + , call = NULL) + } + n <- length(x) # no of slides + check <- slide_idx %in% seq_len(n) + if (!check) { + cli::cli_abort( + c("Slide index {.val {slide_idx}} is out of range.", + "x" = "Presentation has {cli::no(n)} slide{?s}." + ), call = NULL + ) + } +} diff --git a/inst/examples/example_plot_layout_properties.R b/inst/examples/example_plot_layout_properties.R new file mode 100644 index 00000000..fd24db2f --- /dev/null +++ b/inst/examples/example_plot_layout_properties.R @@ -0,0 +1,17 @@ +x <- read_pptx() + +# select layout explicitly +plot_layout_properties(x = x, layout = "Title Slide", master = "Office Theme") +plot_layout_properties(x = x, layout = "Title Slide") # no master needed if layout name unique +plot_layout_properties(x = x, layout = 1) # use layout index instead of name + +# plot current slide's layout (default if no layout is passed) +x <- read_pptx() +x <- add_slide(x, "Title Slide") +plot_layout_properties(x) + +# change appearance: what to show, font size, legend etc. +plot_layout_properties(x, layout = "Two Content", title = FALSE, type = FALSE, id = FALSE) +plot_layout_properties(x, layout = 4, cex = c(labels = .8, id = .7, type = .7)) +plot_layout_properties(x, 1, legend = TRUE) + diff --git a/man/plot_layout_properties.Rd b/man/plot_layout_properties.Rd index b7071f39..b8e4aede 100644 --- a/man/plot_layout_properties.Rd +++ b/man/plot_layout_properties.Rd @@ -12,15 +12,16 @@ plot_layout_properties( title = TRUE, type = TRUE, id = TRUE, - cex = NULL + cex = NULL, + legend = FALSE ) } \arguments{ \item{x}{an \code{rpptx} object} -\item{layout}{slide layout name.} +\item{layout}{slide layout name or numeric index (row index from [layout_summary()).} -\item{master}{master layout name where \code{layout} is located.} +\item{master}{master layout name where \code{layout} is located. Can be omitted if layout is unambiguous.} \item{labels}{if \code{TRUE} (default), adds placeholder labels (centered in \emph{red}).} @@ -34,6 +35,8 @@ in the upper left corner (in \emph{blue}).} \item{cex}{named list or vector to specify font size for \code{labels}, \code{type}, and \code{id}. Default is \code{c(labels = .5, type = .5, id = .5)}. See \code{\link[graphics:text]{graphics::text()}} for details on how \code{cex} works.} + +\item{legend}{Add a legend to the plot (default \code{FALSE}).} } \description{ Plot slide layout properties into corresponding placeholders. @@ -55,12 +58,21 @@ function family: } \examples{ x <- read_pptx() + +# select layout explicitly plot_layout_properties(x = x, layout = "Title Slide", master = "Office Theme") -plot_layout_properties(x = x, layout = "Two Content") -plot_layout_properties(x = x, layout = "Two Content", title = FALSE, type = FALSE, id = FALSE) +plot_layout_properties(x = x, layout = "Title Slide") # no master needed if layout name unique +plot_layout_properties(x = x, layout = 1) # use layout index instead of name + +# plot current slide's layout (default if no layout is passed) +x <- read_pptx() +x <- add_slide(x, "Title Slide") +plot_layout_properties(x) -# change font size -plot_layout_properties(x = x, layout = "Two Content", cex = c(labels = 1, id = .7, type = .7)) +# change appearance: what to show, font size, legend etc. +plot_layout_properties(x, layout = "Two Content", title = FALSE, type = FALSE, id = FALSE) +plot_layout_properties(x, layout = 4, cex = c(labels = .8, id = .7, type = .7)) +plot_layout_properties(x, 1, legend = TRUE) } \seealso{ diff --git a/tests/testthat/_snaps/pptx-info/plot-content-order-default.png b/tests/testthat/_snaps/pptx-info/plot-content-order-default.png index ce77b9f3d67b104877a1c87c146c95fce7bb5c44..b6137a401c3654e6dfdb4a475c682bfcaa55bd81 100644 GIT binary patch delta 8165 zcmZ8`2Ut_f+BKGgA_P!5q-dllU_@#{7YI_L z1Vp4s2@#MWC3HxkhWZE2Ip4ka-_P*u%*;D$_S?^pBoaL+8kq{x8VKIuNNG}~x`kXai z@jK*z*w<|RL0!+dvExTp^L>&bKSgw@1Cq(AO5a2D=YlkGwwwywt|%t2>M%3=)O04% zdf=7z;#<<>488%%0`2H5VhaKBoJbJ7qy z)`7_C|B6LsQa81Omfj<1Wyb5XN}(xYtvNg+_%*%S#_7%M$0Jup97F-=_@eC-n(U>a zYnL!cV6$tfZLPa!2b+idVQ5gizA%rDLN9k1dKy|Khqa7;aqiuz;Mq>4J{*oOc4P8M zx`VmJB9fKJs~As*5&JL+O!;c~Xy`H6O-RAPOfWm)+*Z6tZt>|XPN(>di|fIqTI;T9 znP3gZ^pg4N7-h%A4gj5lDu;U@rk{+&U+K#ZNc|QURgsfuU7$9wn5)viE>c6QTzqJl zzHKTjxc@Jf3tn1i`WY;AEzw_V6xp@$Nr_y~{S-ARM5Il{G(Fp@-}F^qN5xpk#NA77 zi^;vDZ_G5#bhoN%V!TUA>R5HXAZ?>DgArv!JcU_uj1i9_f$e}=&7H;g9G;XCtt*>M z#TK)MrBh`@CQrpju=!JZ#OS1bh_~Ojm|SE{7qjDrQk}gT7pj>SDM6II z;Q7=iowH>X;E#4WkO>V=fNRmO>X5`%+b}cJZ|ZW0)jUZ1TEa56mD}$)u_b22+2tq6t+!HvjwfZ zGxsj7KIfCM#%z{JTZs2L=yxU$nJ9|^Bj{+T$sBMKiqfE!$q)|d(FX(G!wxI1F3gX| z!ys=EpL}bGff8zt>KQ4X`jR>-uhGEopX%ma!W+416yM|WL)6C+jrR>_7 z(r0sLu3A7ED?`@d8ep$rOO|i@KM&1RpTIVQ<21JZcmv*jkV27wG;FT)gYoohPIg5B1|!x!%44%LLm7Q~@KAa8{ZMIZOVOUCG&-Be?LCYt<#0unaNOeIEJo_HNjgKY4qZ^TFCM6`QYt8;BjP|tEYau4 z7oi!zsK^R(*;R^-l*i7-j@|b-LzU1SH-7m~-2xy^HJnU4LKA0K-`n}|?j?@Dh-_T8F{?r<_dwHen%x|x z2V`dk>PBAuY==!X<*|S9lM;%UgF(1dAH&!#b%!GtObOZp9D>YJWbL6m_78Il8#39$ z0h!>BF?F1`#k1^RTU_qe#jra1D?VH;HquKHj^)Z@zyBO|u|6C8_*h1Vg(l-v^y5w= zHZj{`cD4(sFM@oi1Sxlxb-=)vyUXz7q#dePh+pN%^4IgG2a=?UpV1OwmiJgcV_~j; zVfVEr^;%+9!!!M`aE?D|xpNbl3*4EY504{209eP%|KM`hxqg*d04Z05D)I$8`$pg*^m>$rASxzvT ziZT~adq0i}zjqhXnA<1Q$Xn6%DUCfIdTgj_@~)CT>#&naky1uf%V2IhgwJ*!SygxBCGLj@uqL$GJ+cj!vu8x0l>$%SO?*E;5fZhD1SWRsA4f**{i z1UgX7M^)Am#<8AmzPGKyA3gHw#I1F7EEDqZst!+V$9hlKKlRl-bhTj8 zDEGmDq1QucQ^G-g&(-V<@jV=!VJ#OqyQ0jce7y$uu=f+}J5N;-ckv2=p19Tl`quFRtK2j>zj^uh z)~L_C5AyNQALVxpxVC+*WTN$1gxw_8-6okKZOAMdh@>1oHRI)&`Rvd?V8T zZen3<=m1-v{K&QLa$_?=U)pq^-zG?&K*%m0f6y&&2g3j0k>AWBSETp{4!qn$8G)@0 z=9kq0N*TpXHu*hXZM6|8^6lmXU0<=V?bW;X8DN9wdxBjoY(qt~d7NrT8Q)(x%9Wzs zV0SAAlS4)@Q1tX9;&6EpX-Tj;%@8ETcBEep0qu0WP>7hWp@3^~} zxmAN%N8SHb5L}EDT{P_Njr_-_f6#fDV|yTF#4k`|6Y)KJj29}ASZ`$oNWA_aBZad$meiuk^Z>%#9%Rla$ypZL+ZPsng^1zOk{y(Ba?rX>X zuLcG(mxS_I24*P)BK|qF_f3vO+Dhd%jk09lIw9+%zdHlq2F^#)9*J{n_C@dMP*sN% z-CAxHLKd9d8{7QPR_?aI(F6$ZoWKSCcZ~N;m9kU*Cl$WJf@W6na-*{r7$on%IivtG zC2;(m3v2bru5fl{JIM4|ENjApD5S+j)Q6)Qz~2!q2`Kb*q8+4;c(gvWskzAt1Rscp zmluN4>AdA4vl}tH9wHcCM69*bT3!IE)~ZJTgy=*(WOJ)+{@)mUSB(56gAazdMX8WR z59arn@5PU#G01y|Hrt}}3B5kH-uIslpxuHn2rO6pJOV6@(b`6t1APz3L^ruTyR)L! z0$@_I_z|zuLZ0D&P|pAD9e{p?8u=VA$cWghgNu-NWf~F8Lg=V>@Vj9Sm-?%FR4EXe zvDUJ5bHX;}M$bN(E*rP~5Z5u6i)@!!EcV~q8B`62IFD`Z34@sf4v82f1Jmko6^U>~0X0*C2V95Dc)8?0?0oTf}_fE{KR#g~`EK8I=SN=Mp9 z1~#3iyh-oDrH$781b!9PA%~BI!dp6g)|yDO>9)h4g%Dew+4uvf`5<}~&YV!OQ8|lY zKa&$PFT?~g#nI0fdQYHUo4hw1^ox$$rU29CkhK1|KADIe?on|NeV09b>iV?Ja}^)B zU6M}pSsfXOgB+GCguYP|vEuLPLb+$0n!zBam4(xoJayzqzKMYO(gk7n&tVGvdb5Iu z=tz*YjK0gcjvIBSZEg(CBO#D=y!zH;x=2iP-*IWjN z@{xsQE!wp~4w8dObn>wIdZTh$b(&{C&a?GH2TT0H4?IpPXCNM;*CJ6<5~!@cp>@bU z<8v4yYhuhE!5>vtPv#t`lzOI;&zg)$!Zn$O?ur74J?dKgmtjC2xB-y7ea?`3tZ-wO zaAkMD^`_Wq23_%8CAq6`DXZuBe02z`_LLJ=zc8+19k~@~a?d$uHP0>r$wnRLW&r)tvgg9VEi@1T}HF z2ev@9nmpecE2J2m{N2kjjCq}L;)+cgBH2F8hU%Qpt*MY?vZj(ElPBF&E((rv1o5VM z@W`HjKTo0zUKw)D_J2A`Pm}T6@{t)#N~APgMcXgrX^#s<24TkE>1xIfeU$n90h$%7QnQwW{kKi&)FbZ#SC zQ#}m1b*~;X%LO=Amz+pmEO!qfLdm3`zm$eT>H@d|Uagj^5)(xEq=ok{L^)ogvkSaT z=QXQ*7?j%5*>K?!w**hJ%rJ{0yHB5?%vf7nnSo*{<;g-X>_>&w`zunTC2Zaj5_oAH zeY?9tnVm@6eiTeZgs3wg9P^{FjsNyAi3`q zKht5B!xuZOsOj-LYHDz?ftlr^-pU8MtVO4SwQd>8HYA6-;B;Lol%lPK)vItTmZmz8 zh|ABGV+sC~y1C6jq4Ns7?`dhI8O0Eg|Ld(JCMfgv3@38Ma26 z%rzt2afSwMzQ~g#`uyBoTrH`~-Qp)5Qp4aIKFhckz*J{v)ajhi&RN!f4Mf-51Nd=u z#=SEOhdyl}Uc;0Qw_K3RS>yxY^gDLnMs{M*Y9v)b@26$c49V233fh~BbHozFnWD)q z@e`7t^>e^so1%q7yaOWpwVGMaLs4qB4p5$%^lakvd%{tD#jpdFYK9H@A=W6!8TgPsj77807ffA zs~J4%Qow)XWp=RYrq2d;WFYjlOgf8$0->ONL?b*chA~b&%B^UFS%7FIL;I^?-?;BTg$w)#b+=`5Z1wT(3@#upOVC{%Xwe%&~aoWk~0CM*=O>vLq(H>6#gWQb# z?PW@M-Ys~}!Y#G!W0B&L%JYxrtznr<(JqFN0$JfmS(Tw%R@eT5W)YW4H`{`siYJ@MJMs=PZ-E#7G z){T&9LF)6(G!ME%ftmtK7}Y)(Ro#FKUDWmS6|w(x*++ z+GTIPN|db{-Yg&4U1T~fyi|HN|}=WaUpWIdlA@Pp-FN5wdO&)X1{7{BJi-!!9KLfFytJu#@gwG8#6X+JAW= z&kr#1x9ozItb(=qzT@v9SdKkU+UkDwq%`!z`C)R1C&P{~y9e>6k>9SC%X-DUnwL+Z z*R}f0YQT%}X}k3>uQkChVb!Ez^^t^PSIA2tcYzDe?Mn=kRIlq%X9xrZwI;;{z<~ReK*7RxL6?xgg;a0=F)A@Og ziS|pJwHCUF$g`Kk{)Md~M^i`JN8FE6LQiC^URsE7m8o~l0!Le1OcFZBTA?M)L0)a-4+aYmpLW00^8 z{mhTKFnH6V{&WMNl9XY+Ki^;8?@h> z&Rp>C3~<5=^d&B|!An!kyQeaM{o0Q%M=xU7;d$&%X{|^4&#;wh=2HrkF^*nGWfc#BIM@D=y6WspHsU{kG?Z{ zA~}c&^~EDm7Cro|lN>&e{op-`H{?b63@`((sUd6(sy7B5{-hJEFm2S31rn VIMEC(Vq-nGZyIP7-MIhs{{a_ivMc}q literal 12467 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 diff --git a/tests/testthat/_snaps/pptx-info/plot-content-order-labels-only.png b/tests/testthat/_snaps/pptx-info/plot-content-order-labels-only.png index 4d0448f1cd1e566f74a5eec7208c4234c2bc61f6..6f08093cc0486f38e878844a797aba82f35df4d9 100644 GIT binary patch literal 8354 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 literal 8654 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 LyNW(Pap6AzHe!tb diff --git a/tests/testthat/_snaps/pptx-info/plot-titleslide-layout-default-with-legend.png b/tests/testthat/_snaps/pptx-info/plot-titleslide-layout-default-with-legend.png new file mode 100644 index 0000000000000000000000000000000000000000..d34bfdc3033bd0607ab9c21a30f788e39a16ba83 GIT binary patch literal 10558 zcmeHt2UJs8yLK2xumxtu0!9>PRB*-uYG|RUjM9tFj38AM1EJSYLLDTiv>?(9WsoK^ zG?9c5NYJPVNDG7(LJXk@5+JkyA)I?)oNwK`*0;Vp_rG_o|6l)|y>?Fa*?YfbKks|? ze$PJpzJ-}SbSG>l1OkB?8vJ+-0{IdKfr#JTE)LeHH$UlwK)yI`Ve<23@D>6=Kp;p6 z1b`qA5Cjr}z(EiI#0dg%LO`655F`$QBtVb=BoYCML_#8Q5Ig}SKtO=a?wbjTKmZ6Q z2*L@0a6%%GV8$Vk1OyU5L_!deI0TM>z%dax08zsP#ULR75&;2ekO%kWNS> z5{E5{JYQkT?KIU?K?svV)220B{Hh4guhh5F8SLi-h1J!7CDnBj9kr=7qq- z5dd5V6UPK_6F|vkB9)Xhm5@j!B=E{8Y2p%)5CRfGKmr6Df`CI3Z~y@hA=DrU1dy6Z zU;=~*9ASb<0Kg1@#G9m>sfpACW(JADB{BF-AX5^Ux9Xa}#Asr0o4EWYF2Ep_Fi0du z6PUp|K7$W1aR??3VAdd*1SFGy+hpB=WOm?~pqijSCcp#$Zc_=jiNs|zaTyFQ7tCPd zbNOHfxB$Rskob%yJ{QakKG?9?0w#bD0Kk^D0MII1W&k#^1|b8H1wq`z4ulNE3)lh( z0CCwGIY1x)n?nVF4kW1G=2-vK1DL=869iBsz~=&>jLlA)3W8dI(u#^+oCMuuhqu8E zKL|wT>&>57i^75~1abso_~XT&gR*$6qzJi5yMCY8<5ejmzOOG_GA@sd{&2}=XRVAH z3S}5($p2l{<2-4zCVkecFE|-kAyvJhNpV>$Iz?gG6h2$VXRL2IGw{d9|t+L!&@Ayfqfmkfu9p&(z-Azv1VZ8s4A3MX;o z2=u}QSY+g1Zoo3C7H0e=+C`1`HW*2;W8fA5;)ri*KQNJ`qe8Ubg zfz@FS)hn5&I?nGd_*Q$XRj(T8$i_AZ5J3**@`b0!07$n3Y$?WJdud%?c-7Ug8>EKP zTSKUmxAQwF%baG%Xn27lwDk5b-O3G()m)6BUI?hi6ZmxKS}fc8j0ouY7{`;JmRfCn zZrM^y1#-H+@md*9stN43L)J^9^@Z%~+Kn$J;nNL$i!sf)DEruz^4zEA>8HGBgo0sJ zzcNm@uGSij&6kwakyF%zUDwB9dGb?c9JWuXD0ApcC+}v3zwrxA!MSb=n6jVYt#$oG zPhpjAMxBQ_46UO@`J}7)k)wV9RBE{>uWk_#=e76D&^k=ByDj^GvO z7uV$i82a2a>HDMzb+fzh-xC{9F3SUI@n*;ES6`z0Jkw5)yGB!d(~^AIbNPu%k@wDhQYUeK5` zrFv*?C`gd0W932#S6}^lsF&L!hU#w$MFsV1zptK9=+jUrC1HmBW-wl+Y}7n|pjrNE z&ZwAllOYbv;AdE#P|%$9|K{=WKqVa$^w?OTW1w_+?SvR!pwH8=$uOez{L*dMc39w@ z1p!SbEabQWL(i|R3OT(_6PQsXrwd^|1A|mO^0Sf0QXjSf8 z<_j&Wrx3}47qPqAa;`gAZAZV_R_r+S>#K0#e9#@d?nWd0J>UCODu~e$sC*6!GkC(J zUD50;R9Np;Vk_0)y8;i|({n!s^kFsV*zwnD>%83c{+V_gv##8Ovo4Ckm#R8S4>HIV zSQaCRME{`D+IMQfw_S#7zW(8JARE^{F@4-n63AG3b}5pqU|^^e-QibA`R*ymrmpjl30W z+DtZCMoI9QI5TdU?b|Rt?zOhEV)~XVdK#8HvRHBLXRlz_z=r0qy6p9YzSs!w6{1!u z<`=Kv5bjewU@Vp*Y|g{yz-X5=`kw+h5&m$)s+Oy0XlMQG$u2DWJdk^G5CP@9pjd`*dX-;T+ZtpKl7Ze%g7$^hgd zK~{(k@KcU}joT6$XhW#}jOVZ6wi(|+6-{6dHO*j;?bei08FioDOe%d-=r|=sue7D( zY;oAGuEr1Z;~$I`RtLwr097SuyMr5LFvL|kh}onV=z*RLPUp=iufKPRN=l-8`}w~+ zJLJA`-V#Povk$4Q;*XU*Pw`^2YDM(LLxYC^4lBV|cmm436HBw4K???jLjq0L6>~4@ z91k#qr5VE>GL@jTnsG_t_=iDnUbAtVn!ZqYebvd^Bed@f)bA9N#XLpaVtapbt$scJVWiEs78G&C zd55O-V_=9S%NqlV5hxe*dNw)GXxEHd>&BSV0Mp@+6!0umH4sK%FO5g&tVhf?9Dy1i zhc@%@Sl={dguZNfs&?QDftOv~P#CcakBv^x9?EM7D?P?N8vXLkjL%f+1G)v8Co==z zA=_?mE<3y8AS{(pGlI>eGH2p1U2WGqJfvX)vkwz$>gP7Bp;1;ppbR{LR$PAd-Ep}* zZ5vq@+QaYp(8?*tsdJ-It!6XIlv7vF=q0vmlm{gJRPpm8?89FriNwL|(21EG_zOkp z<4~o9^f2}C_~r)WMus|6$ss7@*m1F%s-d585-NE{lSK1}U1_zQJX~yF zl3(EH595zGga_EbuHS_pBSyfkV0`=%m30hj2eXdZmdqehvEty^97CU6{pLA(qr`VY zFUtb1xC5M`uacAp?A>a0v$8DQ%}!TMkaTD6-V)l;D}M$(ZIMF5bHzo()Fij)R#xE~ z0Tl0cZ>a`LN(1fDEBF1QR@_+s$h@)%ZMfz!(3cDU2 z^t?W}B=}(W>WoPqt8l^wEs)9$cJ*6*qF({n%Sim}zY5ii&1ndnNh17|P#Pko|6hsV{`s`^e-sS<&FZfQ z&i@OsYPW#3i@o`7xw!ff_OjOY-*r$=4aN7;Em9;-6y)tM8|y8+$fp?hF_kLJBLY3V zgG0G(FF%BM2U;Dkpom_@6vxt)ORZa3+f8)bblQtJ)~jAW#bnMlP7Q?jb<@(>>+$gS z2y2+9R8IXdXx26*T_3mFh2i2t$KIgRc)xom^Yx-$)|3&oRb(e_F6R0gFRWSz&UY4Y z&Jzg*QRnkDd~w(V+!|XleR_g-_EjpU(wH{-lrxpeXzF4A&FdkUhe$5)B)1uK{<&w4n^jJD*6!;bIUh5B$RghJZ>J+%7Qe5^8* z48=*bKU&VX2t%4WxYhP%nY=IJ431jU3dHG+H|D1VTHWE_L2IV=J>W22rXrxM({3pX zJ5V1?RzJqP?WQY#nsd{jzy?4jQlGKYyaa2RwSccnZF9Z{?^z!|{wJOaPzwV+Q`m1f z>|^+aZ=ouv$V)I+IwS_(Qy{kU-vj@@x}(`(e!|GI0}Dm1KQ9yw90Xs%EK;yPDGvzo zN!7>uhjG~MP3+XSB^lD96J!cG{+pnhU2J}tugT2seo!{P(50Aic-=v9Z}DXiU+hq`*l2Sxs5w*EF1++)juLJN$mZu6hj|{iCdG{zUn40B) zrs3@MN68-gA-+OoTH+$i?EY4j3BA%U@V4Lj&dY&1-$J+K{B=8CCcr}%Qa(jVuQxyG z9XayZ10IB;RvLlzSMj<)0laaCaRyfVz&%gRDQmeOVZXgg!}bBwNfh-C4}H71Xan)R z1N6%28ufed3&|?b2yIg5oJ`yw4I15ZR8P5?H}_ZjHhEuefrolNx|_Q}>g_NV&-yhU z6(l0|>cTq$n(}{tbFo0|K|E?@T#*fsTdlVkYji6E+px6q&uy~dXpvfa&3?&bi4)g~ z9R2&}nvDPGI6$9UD-I7Bwe0PSShKXDstUFlq9Wfkr(w0J!INQ7Z`kuf&XTTBzJ?SY zc5CAgWluv}?YG2i%`w-CIZH~XLQhM52elYAp{Z@$Cane45-%HxpE7HK*Q0NTWnq`} zUR;FT^to2Vss1D{M?J$QElHn7Z;?2e(0YPjJBDXp0z3E?<$a2RH%`9G!1hIy3YVT$ z1Qze#^@pklx|MgnT2oSqP#kptI0<^|Qbq8_kpdIi92HHy#J|6-Vr#TnDA{l>5l>ZL z7EyyT*llSNR#^ootHCW3Y(2Fg*bZ~%J&mZAObOseXx8&bsIA-9jIG|dsMuioh#xjnTwuBJdrT7d<*{>Fi8-oG@?MQr*cd9o2#mF}s^@WNrTQv;Zo^@Pae(Tp2m5e$%$OE(0sOyXthbbdr8STo!I0*`V8tQDEq(rEaF zbFH<#a}%-Un?>Wg-Kz;~%GIgLcQp{R_J^SROhgo}8!ZbXZu_{2Wo6wd;4A^lt)~0J zMZ4NE-ze@UYzhd1ZLCR05d1kxEtU?tFR3lttg`OZ2Wd>cnsWj?4Q~4E&%u_Qi4W!e zL=C?c(YmKnJx(WYB`#VZ|4bFxYfwR7XnSh{yXjr!MM zxL=Ep9_PBl%2NT=UouvuCU756+Gh&v&#&4PqE*sUVYsl5mGRVk8rC+-%*3Ic$Qc-eKw5kSW9j!DbqRmi9saydiQ_|rNAHkbg$&g-MYR$=CDEW zSU29Gf~ecRWt^vOKHn*r2lzkpE;ORGoq$IB4qr`6mq=``!RD90x!)i53?Kc8ag{c< z^3>4;rhW#cJ_X8NF7dRh>n+IBsHoLA(FY@(`K1q5Zu;=-WF*{MuC4iXDSP7FXcsul zpDQfjUJiBj1i>FGX!FUvyw$sKZ>Zpxs;9NU6naJJdEi2 z#r8(9!f)`N`FIn1<{dRQOC)VXqhT1y+mcc~Q;sqYDaW6z^b@>ENJuBBsd{>8*PY+! zlsoBevh5c0z?;y|Q(ES0LQ^`d4nE|D7V#}v33!^MppI-3*1{dljHFw%oDxz_LF-Zwh36UNG$#R2tc>jCkIkQNW3c!!7*z49hBrgZzTRdS_05gW(?G<*r9*5 zne^ZJAozcOU*qP!Ztod)L$#Y8 z+CM8SDni}*>hQf1>G}Yx&OZ#?rLU#b?$i9bVxtV1kfar(dkzeNrixOB_wHJpVk+4N zjr4v;?{sf{J6Ka@oL)>BJ~>HX2hYarnw48V31uCrNwspr-Ugytr}DituEUB{Y2LLX z_*+r-8;Q%@TitUjZIAt#5sUY2D#AO?Yn##9UZ$i!OlY>X-@rE^TxGS{;Ac;UX_bL| zn6uEQ3bj(4E^VYo@t}&1cD%@4JPO5w8_+dwZqXMp*Sg}HojpB{A50-luct&{vf%OI zIF)jb242bXSLhhEH{bErxkq`@v?()uTiR)SRkl}tN4b6O>)KU-Ay0+Zs>6Pbt9NiR&fiqpZAV0R$eW|t9d<;nDv z=YtqmvvMLZvvj*CZ&$m{NaKTQg5h;zoGxVW6Zl>8 zBeelnZ9GO}QVnUl1o*J^jUGR|sop{Yt-$fB4WAB31o_Og3Ttb=tb{Dm78^GA1Jvm-~6pHT)yR9TFl`DiD}LXhILKa(<^|Tv#u57f4y8~ zC|7HMHKCOiOxVSAmA1Fegu{ims}~XjH`aDQnN0cN3c9z~i=KvY+iH=&pP`M9aG51O zo&*1}4i1+mFyU}OUOv6eekY8z?yUxEo977>91^gAy+EDoWuBGk1|^%Lk#VLuyeEXg z<%WHAyERS)WK6Fw?Qx|HOw%0(ADhv}M}a$Q4c-xkHdU*&qJHpoDjEF#rGH1Rr8Xhf zsg|s^Tam~fe!Tuwf4?2&(4*zf*_S~}K4cBr%zD}~+x^0Db@)!Z=K6krah}%uE{%>LO-oGSnZYmo)^_#B4RrBd>ClVehKLsKeLRVj4)<2m8PmgpIyCC4#v3u5ORZ`ZiXDQi|X9x-&~!2o99e$(ZFNyQ$Q z+~%h{+H6-^z{4k&C(^3+NoQf`m5=8OIPO(;nqbL0<`F%=wn9z}G-pYUF z+!w*QvJhPI0G@T0et|!jAOL1uh)S5?tA&mtJqNjs$%OH=KF{9)`p1Qb_q%xV>s&q$ zJSJcuUe-|-@e!XZH|F@nNbmbA8kH-yHj(qJNoFDE_hbp{{FM8-*_7X{3iGCyO!pO; zYZQ5dzG370sLO$5c$Nmev0qL125(4Mn1|V+2WwYF-TXax z(s8P6cOopr4Cc}R4i^x;?KyBc3kyEWbZ@kw_~n6#V)n3Xu_O4pv3dmRoC&vhMAS3O zJu{txT@HihQoATY-$R|#;hnPjj#Jv^!UD&6&v(+$LXLZi1dQ7dI(6+;IO=Ic>@5Kr zrGC30s$Y&8d?Oiq{tE1#pzrVhZ@AY{7@qS;|>w3MOuh;8(UDxZn(p@K= zpYPeIAS>73sbIk3ky&%}!a_P3Br=^264+RD7LU%Gqx0k}av_UM#s?}K)Ti@UEFKRe zu+8!2K$7$1@;MfHjzyp2fyA2Q@$gLws7-~9SCjGZje0>(375QL`@&N;AGrBG>F(j} z@TT8Rj&FbTWc#gwW4>?tJa6Xys<+8-^uf_9T84kS4Z_1WDzqQ$JNY%}`aM#BMi?54%+d_7~Nw{FrYnqZ$V@ZF17EJ(q%Qg?9D3ff>;CC2j{_=n`< z#N0ty@@t$_bO_^93g{AtmPc%z9e-tz5a*xchD*2*-}t3Bal31c)5ow&1vrj$@hXq4 zggog1?V;Dc3lJ+MKNILfCY)*FhYXVBsi?00wOCH&s@Mu&P0yzf`WkYuQ;Ia7x^E?f zNg)ZH)op3rKPYESD!g+m2#{0XdAMTV#_j(0wBc-EJ_TsX|u>MBuLGtm2aMObjqJnwB-V?y+Y=tO3Zn7dC*(dEA zFO>^OiC1kv_e^^@Mor3hOFw@_(URSEGrjooof)`7hhpq=C#UrKNs&Q=Ttwt{o1Ya( z!+--1K%YpFjFpae%nWgaU_qFcYimhR(_FUg4c{b zmeC(LGQ#fW5xG610Xp{Ph%Ph0w}Z;dF-K7k#TU%=I?;h+u`d$scD4Tond0e`c|Nfk zp4b~%Gi1988&1_o$5D+}dg`}K59?M5ZwCAUIUDFkx1jXW$~S@0+i{BKA!ly+oVcB> z#JaVTXKE`PkUX#*7~PqM6B{Q>R215_>*I@WFkn%8BR(Zw?FM~y3_z|RW8+b%sR^`3 zt#JvW{O6GS5$?3FTOTA;k99Xk18ccR>tHP+ufv~xc694%-@4gu_r`jJ^>mW$mC)LsyocBnoL0OS zGIiAtx@^)n7()SsvL;D^WB3>3->t&_$77<;4qk{gYFbQ6ml}x1Uo&U>G8NsoMxq@S+5|J56iy5pQyL)b#A}$UV64*| z!ByMgEb$}%X}RD9+*vf>bw__~@CX;@sj+-=#DE(LLufrAD{@Id>B@~g#(cqEUyJE4 zK%6LRSX7vhP7%kj^iZ*nb)Jnq2aPm^EcxAs4Fn1~es)y-WNOinzdSy4iK8OC{Tl8n zu!wU;iM`(-h?>+gu1->woa?;}Oi2k7MjpK-52{#QOn0*+QmuYpMmY{qx==tJu-5uc zMA!?#$IZmoO-|u=Je9qwk#6r6{&b8`2Rgib2i7|62xx^2t{mMU!wD372{~B$$Z%F( z+)`pi;t5fIc1Qw6S9|!|OO&lI)Id~(I4=EcKBoFj()kN!N|9|5IK0xOvZCDb#bemK zt|<#qRpTv+vEJzcwR~nFQa4v&kdTu#zcg-jrs4XfD&}<6u-_RZ=SeGz#{DO0Ct@Sl zE-Jo$0S`$Ps5g4mduUnPx>3>mZ zhhpdc3G6~xKgV5Qoe>=OU%M=dvV>@~%PD_!TvD70*=P9I^Kt_;|4aLjn~NL##@Br8pE8`3|*4lxw*9H%8cGc2%@AU0`i zkubgpty2w7DrSA3>y2LUh6YK`_-4A(h)15|1nS$7{;KxF+4obCxC>3bju|+r(n&>a zA}0_u2HZYOqPM74B0pLqdSQaQaFVkxrky6WVt5w&=4#sgCo0#SHu_?L$J>hZ&%?}z z(2dk2yMX;pfqQHjjo+XD>%S`1{9Fv~EzevnO3Lo-|8@Ej9>@A2>=Tg=g4Iw-#jvW}P5{mG-+&b^<=mtISZveSY=T1@mdc} zY$wj_Istw2cN#9eLE`1Hd#nO)@?#1p!+Y`Hp;tJ+CmwJNQ1241iM;!JAXK(IKj-_} zTD(4dG84Bi(Rt->-9>~EgtSqMISb5tRqNWc#nSNy)+Igpfd;Xtk#zAf?WCfb4Kr*} zRhfQy{YQ%li@74{+F7NRn4)BO=3T(Y!P(yJ|1$P7X6JkB?G}kMGszgTi0*{Y+Yf;` z^fO38eEM+jhT`YO5K}+|u%0c>J<2ov|EPg=T<2=NF3A{T2v;RlmD(EE4nfp}hXrF{+m6pnD$1NGW4VH5Y@ zjX_{%yI&@zZZZ(>m}Il=-^Wjono0qZ-9z9Pfc+x*Sd`7N?p+WRIZU<*CS7 zkFSkI*Ig5Uw@T+tu0q#TEl9U*m?MPu_te`na80VqQ2&;7TXdH|&QsT20T7?$?GJXN ztI#6g-De5ZU;W^_TybE~kICD#n54hg;jC{TzxzOaWdphnEO~IhyJPdV>n@I>=zRrx z0b>M^Y;Z|4g$ycyi>*BkH)#){$3@UEj16iFeL0rn>f8LW_>`Y^0ul1ys}2%= z(#385u{-CiP65kZ$&xPLQ;K`dMT(Dwm@3KWrv?Y#-T4YHE_@>68XTh6Kf%+D04&`u zq}io!^v>D*11qKwvsdB>9BLqLNDKT08M6vt%8Q!`m@?anm9?QXkd0ix)c{sA84rZ% z1Z?%EhPKTaCWPa4F*br`e==aT7v>P*LHkn!hm}=1To~ZYZ|dl(Q!%UuR@~fc)f(ql zlsDtKKWQuD28!gn&t9yVH1eW%P3;_f|3v+z-w?AxzGCa*w{m8J&h!w}m^AsqnB< zoffYn_orPE77hc$wSUf7*!?WDcydy)Kp(R2@?+vSVUiu8L4ilo)xE0Q$T$kWC<3BE zZ`DK}hFU)r_N zq2?0KC^&RTyFW$A-5u&qQghLRd`N}A_TQiO?Gw@v;l5`}O zUXH`^2dWB$!(@b*F=KQoYul%1dmiVt0{@To*Fml9pp1NOe<)K|3MbDlk9@DhQ(WWQ zsiT>98J_Lt2gx&$;Tc7ZBV_F;XxlT|=qB1fQz8u9VBYmG^8J`r=Coju4&lLvUc1r4 zy1orqL#(pz+ZEZVdP0L@PZ*T>T-Wf|ydPA?U6sZ`t}bgmGwIrtio58VlhRsjTjSZO z6UpC+TINFqmnil_PYvD18zQNi4L1S^-0}Zv=*ZF5Igo01iL%U_1LL8c8=7vg7`PX0 zKv!j#Q27%N@!>n~Rl?Mp74R_i$3G2dc^95TDX8Lew+;Y}hu(2JZX9ZT?6Y*ROmQme zoA;EzF_ZL$=v{($9S+v0`aCqV@CWN#B*kf`MR71ScNp-Fwc=gMbPA!M{?Y zvMUXTnZoj^Dk9E*QgDMlK4rGR+*;3h0PyU7+G}F};R3Smh7LW|s+VLLpk7}us z^WZWM6ho1Vj}6k^)G}v6|4C!@b=7duVC_WzC=upz5H(A++@I@88{#{oIJ%@A7oBOV z+i7-PI-b|G@q1#|vI}f`VVUnW#7R9d=Q^03aq@}&-pD9xHz;muemVX+aF)-u4X_s*C*~iN2 zO}-k6^p>A9^Kx->6hv{ZK`k2(7KFKc=-rC+_INjY#k)+ELCSIEwvfQ(taqD#k-r+} zCtU>CP1#dhhDPqpGCOB?n1{Y}vUy~8_M@LxZ>a7ZF2XywvgUO`Y*{Zm5ZASO;=;Gt zt?d1k2QUaq*RiR{(BSg8H-Rd?VaSIs)oUwzahU<*K;6kOlAH8Z5~KIi8M1r3a8qA-yOB@E5!zz!-rZai4n#KPFZmDCzQH%SPP$6SQS= z@gggaOSTxeI*l%pXtT-K;7JdwY+r50ho1Pa0d+kC5jDL=kn85tRz2da zFNyah*=JhSk)n6iNH zN<0+cUfvV^OnhbHQAaFw_|+kEl5lHOTTPdAWrT|3YgF#sj8)b|YWx`X<6}MkZO6;;nJ_Lrei%N@$ z++{t$)s{!j3?xe`KQV>p$u>4;<1ei;JgG;`GA@GeB?#6;#;FY{%!m*%ofLs7t}ha?LlBXU&;aYeu;WS=49@ag3ZzOuIAQn0#m=o6%d z*j=bMmTdO`Lgd^rf#i%jvJb{MJjWPQk+y_Yn)<|^CI(1S3X}jenKBAqU;y}9{k1DG zt4{Jekz{xX6!}Ipy1b`htr@0r^&Iq+S=+M~e7r(i6*Jw1_AW)~4lUtPmn-4?2Zm?0 zxO5vcao3N5&nZeLaEaUE5>?HShOOhj!YZ!rYV+I^H-){P+w&(~lqwc;QB+Ct| zIpKRJ%eFkbRdJhXd6f6pHM2KgZ2c^mMgO(r)0D4&{|#CjV?cf;4^a z;8>0ZEz(5(7Jc8t_k4Z;czZNM-h2)J8UI6dIZygBRJQTs(>?0}0E6hSaZj#-o#^`D UG#d2R2Cz9FcRyBo)c>#l0oGJXM*si- delta 6263 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 literal 7158 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 ZFZRY=A*1&W{22@3xzl$?=?`J2{|+(w1ZDsL diff --git a/tests/testthat/test-get-layout-helper.R b/tests/testthat/test-get-layout-helper.R index 853ad65c..08e6ca79 100644 --- a/tests/testthat/test-get-layout-helper.R +++ b/tests/testthat/test-get-layout-helper.R @@ -84,3 +84,44 @@ test_that(" prints correctly", { out <- capture.output(print(l)) expect_equal(length(out), length(l)) }) + + +test_that("get layout from slide", { + opts <- options(cli.num_colors = 1) # suppress colors for error message check + on.exit(options(opts)) + + x <- read_pptx() + + # fails if no slides exist + expect_error(get_slide_layout(x, 0), "Presentation does not have any slides yet") + expect_error(get_layout_for_current_slide(x), "Presentation does not have any slides yet") + + # detect correct slide layout + layout <- "Comparison" + x <- add_slide(x, layout) + + expect_error(get_slide_layout(x, 0), "Slide index 0 is out of range") + expect_error(get_slide_layout(x, 2), "Slide index 2 is out of range") + + error_msg <- "`slide_idx` must be " + expect_error(get_slide_layout(x, "1"), error_msg) + expect_error(get_slide_layout(x, NA), error_msg) + expect_error(get_slide_layout(x, NULL), error_msg) + + expect_no_error(get_slide_layout(x, 1)) + expect_no_error(get_layout_for_current_slide(x)) + + la_slide <- get_slide_layout(x, 1) + la_current <- get_layout_for_current_slide(x) + la_reference <- get_layout(x, layout) + expect_identical(la_current, la_reference) + expect_identical(la_slide, la_reference) + + layout <- "Title Slide" + x <- add_slide(x, layout) + la_slide <- get_slide_layout(x, 2) + la_current <- get_layout_for_current_slide(x) + la_reference <- get_layout(x, layout) + expect_identical(la_current, la_reference) + expect_identical(la_slide, la_reference) +}) diff --git a/tests/testthat/test-pptx-info.R b/tests/testthat/test-pptx-info.R index adf1635b..48959c17 100644 --- a/tests/testthat/test-pptx-info.R +++ b/tests/testthat/test-pptx-info.R @@ -99,30 +99,38 @@ test_that("plot layout properties", { ) dev.off() + png3 <- tempfile(fileext = ".png") + png(png3, width = 7, height = 6, res = 150, units = "in") + plot_layout_properties( + x = x, layout = "Title Slide", master = "Office Theme", legend = TRUE + ) + dev.off() + expect_snapshot_doc(name = "plot-titleslide-layout-default", x = png1, engine = "testthat") expect_snapshot_doc(name = "plot-titleslide-layout-labels-only", x = png2, engine = "testthat") + expect_snapshot_doc(name = "plot-titleslide-layout-default-with-legend", x = png3, engine = "testthat") # issue #604 p <- test_path("docs_dir/test-content-order.pptx") x <- read_pptx(p) - png3 <- tempfile(fileext = ".png") - png(png3, width = 7, height = 6, res = 150, units = "in") + png4 <- tempfile(fileext = ".png") + png(png4, width = 7, height = 6, res = 150, units = "in") plot_layout_properties( x = x, layout = "Many Contents", master = "Office Theme" ) dev.off() - png4 <- tempfile(fileext = ".png") - png(png4, width = 7, height = 6, res = 150, units = "in") + png5 <- tempfile(fileext = ".png") + png(png5, width = 7, height = 6, res = 150, units = "in") plot_layout_properties( x = x, layout = "Many Contents", master = "Office Theme", labels = TRUE, type = FALSE, id = FALSE, title = FALSE ) dev.off() - expect_snapshot_doc(name = "plot-content-order-default", x = png3, engine = "testthat") - expect_snapshot_doc(name = "plot-content-order-labels-only", x = png4, engine = "testthat") + expect_snapshot_doc(name = "plot-content-order-default", x = png4, engine = "testthat") + expect_snapshot_doc(name = "plot-content-order-labels-only", x = png5, engine = "testthat") }) @@ -146,6 +154,26 @@ test_that("slide summary", { }) + +test_that("plot layout properties: layout arg takes numeric index", { + x <- read_pptx() + las <- layout_summary(x) + ii <- as.numeric(rownames(las)) + + discarded_plot <- function(x, layout = NULL, master = NULL) { # avoid Rplots.pdf creation + file <- tempfile(fileext = ".png") + png(file, width = 7, height = 6, res = 150, units = "in") + plot_layout_properties(x, layout, master) + dev.off() + } + + for (idx in ii) { + expect_no_error(discarded_plot(x, idx)) + } + expect_no_error(discarded_plot(x, 1, "Office Theme")) +}) + + test_that("color scheme", { x <- read_pptx() cs <- color_scheme(x) diff --git a/tests/testthat/test-pptx-selections.R b/tests/testthat/test-pptx-selections.R index 7e8725d8..8e5456a1 100644 --- a/tests/testthat/test-pptx-selections.R +++ b/tests/testthat/test-pptx-selections.R @@ -21,6 +21,7 @@ test_that("check slide selection", { }) + test_that("check errors", { x <- read_pptx() expect_error(slide_summary(x), "presentation contains no slide") @@ -40,6 +41,7 @@ test_that("check errors", { }) + test_that("get shape id", { doc <- read_pptx() doc <- add_slide(doc, "Title and Content", "Office Theme") @@ -54,3 +56,23 @@ test_that("get shape id", { unlink("*.pptx") + +test_that("ensure_slide_index_exists ", { + opts <- options(cli.num_colors = 1) # suppress colors for error message check + on.exit(options(opts)) + + x <- read_pptx() + + expect_error(ensure_slide_index_exists(x, 0), "Slide index 0 is out of range") + expect_error(ensure_slide_index_exists(x, 2), "Slide index 2 is out of range") + + x <- add_slide(x, "Comparison") + expect_no_error(ensure_slide_index_exists(x, 1)) + expect_error(ensure_slide_index_exists(x, 0), "Slide index 0 is out of range") + expect_error(ensure_slide_index_exists(x, 2), "Slide index 2 is out of range") + + error_msg <- "`slide_idx` must be " + expect_error(ensure_slide_index_exists(x, "1"), error_msg) + expect_error(ensure_slide_index_exists(x, NA), error_msg) + expect_error(ensure_slide_index_exists(x, NULL), error_msg) +}) diff --git a/tests/testthat/test-utils.R b/tests/testthat/test-utils.R index b824f475..02511776 100644 --- a/tests/testthat/test-utils.R +++ b/tests/testthat/test-utils.R @@ -16,4 +16,3 @@ test_that("misc", { df <- df_rename(mtcars, c("mpg", "cyl"), c("A", "B")) expect_true(all(names(df)[1:2] == c("A", "B"))) }) -