我有一个Shiny应用程序,该应用程序根据用户输入动态生成计算机代码,并将其呈现给用户,这样他们就可以准确地查看将哪些查询发送到数据库。我在用户界面功能中直接使用代码突出显示了棱镜语法,因此我知道了棱镜在工作。但对于代码在服务器生成,并通过发送给用户renderText
,并htmlOutput
突出显示不工作。
这是一个简单示例的图像:
该文件是通过此R文件(以及www
Shiny应用程序文件夹中的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突出显示其内容的原因。
我应该怎么做才能像第一个那样突出显示第三个块?
Prism.js在加载后立即运行,因此以后动态添加的任何代码块都不会突出显示。一种选择是也可以prism.js
动态加载服务器功能。
output$sql <- renderUI({
tagList(
tags$script(src = "prism.js"),
HTML(txt)
)
})
但这不是很可靠。您可以轻松加载脚本的多个副本。而且,如果将其设置为shiny::singleton
或htmltools::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] 删除。
我来说两句