如何使用htmlOutput在R Shiny应用程序中启用语法突出显示

彼得·埃利斯

我有一个Shiny应用程序,该应用程序根据用户输入动态生成计算机代码,并将其呈现给用户,这样他们就可以准确地查看将哪些查询发送到数据库。我在用户界面功能中直接使用代码突出显示了棱镜语法,因此我知道了棱镜在工作。但对于代码在服务器生成,并通过发送给用户renderText,并htmlOutput突出显示不工作。

这是一个简单示例的图像:

在此处输入图片说明

该文件是通过此R文件(以及wwwShiny应用程序文件夹中的pyramid.css和prism.js)制成的

   ui <- shinyUI(fluidPage(
  tags$head(
    tags$link(rel = "stylesheet", type = "text/css", href = "prism.css")
  ),
  tags$body(
    tags$script(src="prism.js")
  ),
  HTML("<pre><code class='language-sql'>SELECT * FROM mytable WHERE 1=2
       -- this chunk should be syntax highlighted and it is
       </code></pre>"),

  HTML("<pre>SELECT * FROM mytable WHERE 1=2
       -- this chunk should not be syntax highlighted
       </code></pre>"),

  htmlOutput("sql")
)
)


# Define the server code
server <- function(input, output) {
  txt <- "<pre><code class='language-sql'>SELECT * FROM mytable WHERE 1=2
       -- this chunk should be syntax highlighted but isn't for some reason,
       -- presumably connected to it getting to the UI via renderText and htmlOutput
       </code></pre>"

  output$sql <- renderText(txt)
}

在DOM Explorer中,我可以看到在Shiny生成的网页中,第三个(无效)块位于内<div class="shiny-html-output shiny-bound-output">,然后正确包裹在标记中,<pre>并且<code class="language-sql">像第一个块一样被标记。因此,将其包裹在div中是阻止棱镜.js突出显示其内容的原因。

我应该怎么做才能像第一个那样突出显示第三个块?

格雷格·L

Prism.js在加载后立即运行,因此以后动态添加的任何代码块都不会突出显示。一种选择是也可以prism.js动态加载服务器功能。

output$sql <- renderUI({
  tagList(
    tags$script(src = "prism.js"),
    HTML(txt)
  )
})

但这不是很可靠。您可以轻松加载脚本的多个副本。而且,如果将其设置为shiny::singletonhtmltools::htmlDependency仅用于加载脚本一次,则很容易回到原来的状态。

更好的解决方案-Prism提供了一个API,可让您以编程方式突出显示代码块:http : //prismjs.com/extending.html#api

Prism.highlightAll()渲染任何代码块后运行如何

library(shiny)

prismCodeBlock <- function(code) {
  tagList(
    HTML(code),
    tags$script("Prism.highlightAll()")
  )
}

prismDependencies <- tags$head(
  tags$script(src = "https://cdnjs.cloudflare.com/ajax/libs/prism/1.8.4/prism.min.js"),
  tags$link(rel = "stylesheet", type = "text/css",
            href = "https://cdnjs.cloudflare.com/ajax/libs/prism/1.8.4/themes/prism.min.css")
)

prismSqlDependency <- tags$head(
  tags$script(src = "https://cdnjs.cloudflare.com/ajax/libs/prism/1.8.4/components/prism-sql.min.js")
)

ui <- fluidPage(
  prismDependencies,
  prismSqlDependency,

  HTML("<pre><code class='language-sql'>SELECT * FROM mytable WHERE 1=2
       -- this chunk should be syntax highlighted and it is
       </code></pre>"),

  HTML("<pre>SELECT * FROM mytable WHERE 1=2
       -- this chunk should not be syntax highlighted
       </code></pre>"),

  htmlOutput("sql")
)

server <- function(input, output) {
  txt <- "<pre><code class='language-sql'>SELECT * FROM mytable WHERE 1=2
  -- this chunk should be syntax highlighted but isn't for some reason,
  -- presumably connected to it getting to the UI via renderText and htmlOutput
  </code></pre>"

  output$sql <- renderUI({
    prismCodeBlock(txt)
  })
}

shinyApp(ui, server)

为了进一步改善,您可以使用Prism.highlightElement()它来提高效率。也可以从这些Prism代码块中创建HTML小部件,以抽象出混乱的细节。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在Neovim中启用Ruby语法突出显示?

如何在Atom中启用语法错误/警告突出显示

如何在Atom.io中禁用语法突出显示

如何避免在R Shiny应用程序中显示为HTML标题的代码?

如何在Atom中为.vue文件启用语法突出显示?

如何在闪亮的应用程序中突出显示活动代码?

如何在r markdown ioslides演示文稿中的代码块中启用语法突出显示?

如何在我的R Shiny应用程序中显示使用rcharts创建的图表?

如何使用语法突出显示单个文本输入字段?

R ShinyHelper失败并显示htmlOutput

无法在R Shiny应用程序中显示模式警报

如何在ATOM中为Python启用语法突出显示

如何在闪亮的应用程序中嵌入的markdown块中突出显示R或Python代码

如何使用Pandoc为Markdown内联代码启用语法突出显示?

如何使用shinyjs将graphviz节点数据链接到Shiny UI htmlOutput?

如何在R Shiny应用程序中显示嵌入式推文?

如何在Ranger预览中启用语法突出显示?

如何在Visual Studio 2012中为* .handlebars文件启用语法突出显示?

如何在Notepad ++中对.aspx和.ascx文件使用语法突出显示?

如何在Netbeans 8中为* .handlebars文件启用语法突出显示

使用Redcarpet&Pygments.rb在我的Rails 4.0.4应用程序中突出显示代码语法吗?

如何在nano中启用语法突出显示?

如何在Android应用程序上启用语音通信?

使用global命令时如何在vi中启用语法高亮显示?

如何在PowerShell Core中启用语法突出显示?

R Shiny htmloutput与imageoutput内联

如何使 macOS 应用程序中的 NSButton 具有突出显示的边框?

如何在 android 应用程序中的活动中显示特定于语言的语法突出显示的代码?

如何仅在电子应用程序中复制和粘贴突出显示的文本?