# File src/library/utils/R/linkhtml.R # Part of the R package, http://www.R-project.org # # Copyright (C) 1995-2012 The R Core Team # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # http://www.r-project.org/Licenses/ make.packages.html <- function(lib.loc = .libPaths(), temp = FALSE, verbose = TRUE, docdir = R.home("doc")) { add_lib_index <- function(libs) { cat('
\n\n
\n", file = out) } WINDOWS <- .Platform$OS.type == "windows" f.tg <- if (temp) { dir.create(file.path(tempdir(), ".R/doc/html"), recursive = TRUE, showWarnings = FALSE) file.path(tempdir(), ".R/doc/html/packages.html") } else file.path(docdir, "html", "packages.html") op <- file.path(tempdir(), ".R/doc/html/libPaths.rds") if (temp && file.exists(f.tg) && file.exists(op)) { ## check if we can avoid remaking it. if(identical(lib.loc, readRDS(op))) { dates <- file.info(c(f.tg, lib.loc))$mtime if(which.max(dates) == 1L) return(TRUE) } } if (!file.create(f.tg)) { warning("cannot update HTML package index") return(FALSE) } if (verbose) { message("Making 'packages.html' ...", appendLF = FALSE, domain = NA) flush.console() } file.append(f.tg, file.path(R.home("doc"), "html", "packages-head-utf8.html")) out <- file(f.tg, open = "a") on.exit(close(out)) if(WINDOWS) { rh <- chartr("\\", "/", R.home()) drive <- substring(rh, 1L, 2L) } ## find out how many pkgs <- vector("list", length(lib.loc)) names(pkgs) <- lib.loc for (lib in lib.loc) { pg <- .packages(all.available = TRUE, lib.loc = lib) pkgs[[lib]] <- pg[order(toupper(pg), pg)] } if (WINDOWS) { tot <- sum(sapply(pkgs, length)) if(verbose) { pb <- winProgressBar("R: creating packages.html", max = tot) on.exit(close(pb), add = TRUE) } npkgs <- 0L } ## If there is more than one lib, have an index at the top and bottom if (length(lib.loc) > 1L) add_lib_index(lib.loc) for (ii in seq_along(lib.loc)) { lib <- lib.loc[ii] libname <- if (identical(lib, .Library)) "the standard library" else if (WINDOWS) chartr("/", "\\", lib) else lib cat("

Packages in ", libname, "

\n", sep = "", file = out) lib0 <- "../../library" if (!temp) { if (WINDOWS) { ## use relative indexing for .Library ## perhaps other site libraries if (is.na(pmatch(rh, lib))) { lib0 <- if(substring(lib, 2L, 2L) != ":") paste0(drive, lib) else lib lib0 <- paste0("file:///", URLencode(lib0)) } } else { if (lib != .Library) lib0 <- paste0("file:///", URLencode(lib)) } } pg <- pkgs[[lib]] use_alpha <- (length(pg) > 100) first <- toupper(substr(pg, 1, 1)) nm <- sort(names(table(first))) if(use_alpha) { writeLines("

", out) writeLines(paste0("", nm, ""), out) writeLines("

\n", out) } cat('

\n', file = out) for (a in nm) { if(use_alpha) cat("\n", sep = "", file = out) for (i in pg[first == a]) { title <- packageDescription(i, lib.loc = lib, fields = "Title", encoding = "UTF-8") if (is.na(title)) title <- "-- Title is missing --" cat('\n', '\n", file = out, sep = "") if (WINDOWS) { npkgs <- npkgs + 1L if(verbose) setWinProgressBar(pb, npkgs) } } } cat("
', i, "", title, "
\n\n", file=out) } if (length(lib.loc) > 1L) add_lib_index(lib.loc) cat("\n", file=out) if (verbose) { message(" ", "done"); flush.console() } if (temp) saveRDS(lib.loc, op) invisible(TRUE) }