From 4e27e32f3924a6e708efe004b5ec640b8e7d1bcc Mon Sep 17 00:00:00 2001 From: e-perl-NOAA Date: Tue, 16 Jun 2026 10:16:15 -0400 Subject: [PATCH 01/12] try fims help function for R and doxygen --- CMakeLists.txt | 1 + R/fims_help.R | 50 +++++++++++++++++++++++++++++++++++++++++++++ doxygen/header.html | 32 ++++++++++++++--------------- 3 files changed, 67 insertions(+), 16 deletions(-) create mode 100644 R/fims_help.R diff --git a/CMakeLists.txt b/CMakeLists.txt index 5ac8b2299..982b8d88d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -78,6 +78,7 @@ IF(BUILD_DOC) set(DOXYGEN_AUTOLINK_SUPPORT YES) set(DOXYGEN_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/doxygen") set(DOXYGEN_HTML_OUTPUT "html") + set(DOXYGEN_GENERATE_TAGFILE = doxygen/html/FIMS.tag) doxygen_add_docs(fims_doxygen inst/include diff --git a/R/fims_help.R b/R/fims_help.R new file mode 100644 index 000000000..969eac97c --- /dev/null +++ b/R/fims_help.R @@ -0,0 +1,50 @@ +#' Smart FIMS Documentation Finder +#' +#' @param query A string representing the function or class to search for. +#' @export +fims_help <- function(query) { + + doxygen_base_url <- "https://e-perl-noaa.github.io/FIMS/doxygen/" + r_base_url <- "https://e-perl-noaa.github.io/FIMS/" # Adjust to your pkgdown path + + # 1. Check native R exports first + if (query %in% getNamespaceExports("FIMS")) { + target_url <- paste0(r_base_url, "reference/", query, ".html") + } else { + + # 2. Setup caching for the Doxygen Tagfile + tagfile_url <- paste0(doxygen_base_url, "FIMS.tag") + cache_dir <- tempdir() + local_tagfile <- file.path(cache_dir, "FIMS.tag") + + # Download the tagfile only if we haven't already in this R session + if (!file.exists(local_tagfile)) { + message("Fetching FIMS C++ documentation index...") + tryCatch( + utils::download.file(tagfile_url, destfile = local_tagfile, quiet = TRUE), + error = function(e) stop("Could not download FIMS.tag. Check internet connection.") + ) + } + + # 3. Parse the XML and find the matching HTML file + tag_data <- xml2::read_xml(local_tagfile) + xpath_query <- sprintf("//name[text()='%s']/..", query) + match_node <- xml2::xml_find_first(tag_data, xpath_query) + + if (length(match_node) == 0 || is.na(match_node)) { + message("Exact C++ match not found. Opening Doxygen index...") + target_url <- paste0(doxygen_base_url, "index.html") + } else { + filename <- xml2::xml_text(xml2::xml_find_first(match_node, ".//filename")) + target_url <- paste0(doxygen_base_url, filename) + } + } + + # 4. Render in the Viewer Pane + viewer_html <- htmltools::browsable( + htmltools::tags$iframe(src = target_url, width = "100%", height = "600px", style = "border:none;") + ) + + print(viewer_html) + invisible(target_url) +} \ No newline at end of file diff --git a/doxygen/header.html b/doxygen/header.html index 15b1d2654..e4b00a693 100644 --- a/doxygen/header.html +++ b/doxygen/header.html @@ -48,8 +48,8 @@