😎 Give your xaringan slides some style
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

103 lines
3.7KB

  1. # Make sure font names are wrapped in quotes if they have spaces
  2. f_args <- names(formals(sys.function()))
  3. for (var in f_args[grepl("font_family$", f_args)]) {
  4. eval(parse(text = paste0(var, "<-quote_elements_w_spaces(", var, ")")))
  5. # set an is_google flag default of FALSE that is possibly overwritten later
  6. eval(parse(text = paste0(sub("font_family$", "font_is_google", var), "<-0")))
  7. }
  8. # Warn if base_font_size isn't absolute
  9. css_abs_units <- c("cm", "mm", "Q", "in", "pc", "pt", "px")
  10. if (!grepl(paste(tolower(css_abs_units), collapse = "|"), tolower(base_font_size))) {
  11. warning(
  12. glue::glue(
  13. "Base font size '{base_font_size}' is not in absolute units. ",
  14. "For best results, specify the `base_font_size` using absolute CSS units: ",
  15. "{paste(css_abs_units, collapse = ', ')}"
  16. ),
  17. call. = FALSE,
  18. immediate. = TRUE
  19. )
  20. }
  21. # Use font_..._google args to overwrite font args
  22. for (var in f_args[grepl("font_google$", f_args)]) {
  23. gf <- eval(parse(text = var))
  24. if (is.null(gf)) next
  25. if (!inherits(gf, "google_font")) {
  26. stop("`", var, "` must be set using `google_font()`.")
  27. }
  28. group <- strsplit(var, "_")[[1]][1]
  29. if (group == "text") {
  30. text_font_family <- quote_elements_w_spaces(gf$family)
  31. text_font_weight <- gf$weights %||% "normal"
  32. text_font_weight <- substr(text_font_weight, 1, regexpr(",", text_font_weight)[1] - 1)
  33. text_font_url <- gf$url
  34. } else {
  35. for (thing in c("family", "url")) {
  36. eval(parse(text = paste0(group, "_font_", thing, " <- gf$", quote_elements_w_spaces(thing))))
  37. }
  38. }
  39. eval(parse(text = paste0(group, "_font_is_google <- 1")))
  40. }
  41. extra_font_imports <- if (is.null(extra_fonts)) "" else list2fonts(extra_fonts)
  42. extra_font_imports <- paste(extra_font_imports, collapse = "\n")
  43. # convert NA arguments to NULL
  44. for (var in f_args) {
  45. val <- eval(parse(text = var))
  46. if (is.null(val)) next
  47. val <- val[!is.na(val)]
  48. is_na <- length(val) == 0
  49. if (is_na) assign(var, NULL)
  50. }
  51. # prepare variables for template
  52. body_font_family <- paste(c(text_font_family, text_font_family_fallback, text_font_base), collapse = ", ")
  53. background_size_fallback <- if (is.null(background_position)) "cover" else "100%"
  54. background_size <- background_image %??% (background_size %||% background_size_fallback)
  55. title_slide_background_size <- title_slide_background_size %||% (
  56. title_slide_background_image %??% "cover"
  57. )
  58. table_row_even_background_color <- table_row_even_background_color %||% background_color
  59. lapply(names(formals()), function(n) assign(n, get(n), envir = xaringanthemer_env))
  60. xaringanthemer_version <- utils::packageVersion("xaringanthemer")
  61. # prepare header background object
  62. needs_leading_dot <- !grepl("^\\.", header_background_ignore_classes)
  63. header_background_ignore_classes[needs_leading_dot] <- paste0(
  64. ".",
  65. header_background_ignore_classes[needs_leading_dot]
  66. )
  67. header_background_ignore_classes <- purrr::map(
  68. header_background_ignore_classes,
  69. ~ list(class = .)
  70. )
  71. if (is.null(header_background_padding)) {
  72. slide_padding <- css_get_padding(padding)
  73. header_background_padding <- paste(
  74. "2rem", slide_padding$right, "1.5rem", slide_padding$left
  75. )
  76. }
  77. header_background <- list(
  78. auto = header_background_auto,
  79. background_color = header_background_color,
  80. text_color = header_background_text_color,
  81. padding = header_background_padding,
  82. content_padding_top = header_background_content_padding_top,
  83. ignore = header_background_ignore_classes
  84. )
  85. colors <- prepare_colors(colors)
  86. tf <- system.file("resources", "template.css", package = "xaringanthemer")
  87. template <- readLines(tf, warn = FALSE)
  88. template <- paste(template, collapse = "\n")
  89. x <- whisker::whisker.render(template)
  90. writeLines(x, con = outfile)
  91. if (!is.null(extra_css)) style_extra_css(extra_css, outfile)
  92. outfile