【问题标题】:shiny downgrade fontawesome 5 to 4闪亮降级fontawesome 5到4
【发布时间】:2019-01-31 15:48:23
【问题描述】:

我在一个与 fontawesome 4.7 纠缠在一起的闪亮项目上工作,它为我们带来了巨大的价值。作为 fontawesome 的免费用户,我认为升级到 5.3.1 没有任何优势。许多免费图标变得丑陋/粗俗,并且必须付费购买专业版才能获得类似于 4.7 的图标样式。

4.7 中可用的示例表,包含 9 个单元格

在 5.3 中的表格只有 4 个单元格和相当胖乎乎的线条。旧的 9 格格式仅供专业用户使用

从我自己的简单角度来看,fontawesome 团队似乎打算强烈推动他们的免费用户成为专业人士。

  • Rstudio shiny 1.1 链接到 fontawesome 4.7.1
  • Rstudio shiny 1.2 链接到 fontawesome 5.3.1

有没有什么简单的方法可以同时拥有闪亮的 1.2 和 fontawesome 4.7.1?

编辑 猪排的链接似乎很相关,我会尝试更新...

【问题讨论】:

标签: r shiny font-awesome


【解决方案1】:
  • 下载fontawesome 4.7.1并解压
  • 在下面的 global.R 中插入代码
  • 更新解压字体的路径

.... 然后闪亮可以做 fontawesome 4.7.1 和 +5。这个特定的解决方案在安装的闪亮库中复制为suggested by Pork Chop font-awesome 的旧版本。我还更新了 icon() 函数,因此可以让 fontawesome 版本共存并确保正确链接。在这个解决方案中,一个新的 icon() 函数被放置在 globalEnv 中,因此位于 search()-path 的顶部。这节省了我的代码库遗留问题,而无需更改任何其他内容。

但是,为了制作一个新的闪亮应用程序,我将命名图标功能 icon_legacy() 以避免依赖于 search()-path 或在支持 R 包中实现闪亮应用程序。

##install new shiny version
install.packages("shiny") #install newest shiny
library(shiny)
library(htmltools) 


#source in this function to globalEnv

#' Legacy means good old iconic times
#'
#' @param local_path_fa_4.7.1 
#' @param shiny_path
#'
#' @return
#' @export
#' @import shiny htmltools
#' @details #this installs legacy font-awesome and return a function  similar to icon
#'
#' @examples 
#' 
#' install.packages("shiny") #install newest shiny
#' library(shiny)
#' library(htmltools)
#' my_fa_path = "./misc/global_source/fa_shiny_4.7.1/font-awesome"
#' icon_legacy = activate_icon_legacy(my_fa_path) #tadaaa use icon_legacy now
#' #btw css pseudo-elements seem to work out-of-the-box also
#' 
#' icon = icon_legacy #you may also feel like placing icon in global env to override shiny::icon
activate_icon_legacy = function(
  local_path_fa_4.7.1,
  shiny_path = system.file(package="shiny")
) {

  #find out what version of shiny is installed
  uses_fontawesome5 = packageVersion("shiny")>=1.2 #because implemented since 1.2
  shiny_resource_path = paste0(shiny_path,"/www/shared")
  misses_fontawesome4  = !"font-awesome" %in% list.files(shiny_resource_path) #because new fa dir is called 'fontawesome'


  #if legacy dir is missing from library copy into installed library
  if(uses_fontawesome5 && misses_fontawesome4) { 
    file.copy(
      from = local_path_fa_4.7.1,
      to = shiny_resource_path,
      recursive = TRUE,copy.mode = FALSE
    )
  }

  #import minor dependency from shiny library into closure
  font_awesome_brands = shiny:::font_awesome_brands
  tags = htmltools::tags


  #source this modified icon() function from library/shiny/R/bootstrap.R
  #notice the legacy feature if true will use old fa 4.7.1 else new
  icon_legacy <- function(name, class = NULL, lib = "font-awesome",legacy=TRUE) {
    prefixes <- list(
      "font-awesome" = "fa",
      "glyphicon" = "glyphicon"
    )
    prefix <- prefixes[[lib]]

    # determine stylesheet
    if (is.null(prefix)) {
      stop("Unknown font library '", lib, "' specified. Must be one of ",
           paste0('"', names(prefixes), '"', collapse = ", "))
    }

    # build the icon class (allow name to be null so that other functions
    # e.g. buildTabset can pass an explicit class value)
    iconClass <- ""
    if (!is.null(name)) {
      prefix_class <- prefix
      if (prefix_class == "fa" && name %in% font_awesome_brands) {
        prefix_class <- "fab"
      }
      iconClass <- paste0(prefix_class, " ", prefix, "-", name)
    }
    if (!is.null(class))
      iconClass <- paste(iconClass, class)

    iconTag <- tags$i(class = iconClass)

    # font-awesome needs an additional dependency (glyphicon is in bootstrap)
    if (lib == "font-awesome") {
      if(legacy) {
        htmlDependencies(iconTag) <- htmlDependency(
          "fontwesome","4.7.1", "www/shared/font-awesome", package = "shiny",
          stylesheet = c("css/font-awesome.css","font-awesome.min.css"))
      } else {
        htmlDependencies(iconTag) <- htmlDependency(
          "font-awesome", "5.3.1", "www/shared/fontawesome", package = "shiny",
          stylesheet = c("css/all.min.css","css/v4-shims.min.css")
        )
      }

    }

    htmltools::browsable(iconTag)
  }

  return(icon_legacy)
}


#download extract fontawesome 4.7.1 and write path here
my_fa_path = "./misc/global_source/fa_shiny_4.7.1/font-awesome"
icon_legacy = activate_icon_legacy(my_fa_path) #tadaaa use icon_legacy now
#btwcss pseudos seem to work out-of-the-box also

#one may also feel like placing icon_legacy() as icon() in globalEnv to override shiny::icon
#if youre too lazy change all your original code. This will work any code in ui.R and server.R
#however packages with explicit namespaces are likely not overridden by this.
icon = icon_legacy

#now shiny code will behave like this
icon("table",legacy=TRUE)  # old style 9 cell table
icon("table",legacy=FALSE) # new fat 4 cell table


#...one may feel like opting for more explicit and strict namespace solution wrapped in some package.
#but that would be a lot more boiler plate code not relevant for this answer

#this solution also fixed my fontawesome CSS pseudo-elements issues

【讨论】:

  • 我也因此尝试使用 fa-5 和 fa-4 进行分叉和重建。但这对我来说变成了一个最前沿的依赖丛林,所以我更喜欢构建香草光泽并在需要时将其包装起来。
  • Rstudio 暗示 fontawesome 未来可能会从闪亮的库中移出并进入专用库,这样可以更轻松地购买版本。
猜你喜欢
  • 1970-01-01
  • 2017-05-08
  • 1970-01-01
  • 1970-01-01
  • 2018-08-03
  • 2013-09-15
  • 2013-04-22
  • 2013-10-13
  • 1970-01-01
相关资源
最近更新 更多