# 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', file = out)
for (i in seq_along(libs)) {
nm <- libs[i]
if (nm == .Library) {
cat('- Contents of the ',
'standard library
\n', sep = "", file = out)
} else {
cat('- Contents of ', nm,
'
\n', sep = "", file = out)
}
}
cat("
\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',
'', i, " | ", title,
" |
\n", file = out, sep = "")
if (WINDOWS) {
npkgs <- npkgs + 1L
if(verbose) setWinProgressBar(pb, npkgs)
}
}
}
cat("
\n\n", file=out)
}
if (length(lib.loc) > 1L) add_lib_index(lib.loc)
cat("