redcarpet markdown - 执行javascript代码

时间:2014-10-08 15:13:16

标签: javascript ruby markdown redcarpet

我使用tripit/slate创建了文档。所有文档内容都在.md文件中。平板正在使用redcarpet降价引擎。现在,当我在markdown中添加<script>标记时如下:

```
<script>document.write(window._restapiurl);</script>
```

它将在html中转换为&lt;script&gt;document.write(window._restapiurl);&lt;/script&gt;。该语句位于<pre>标记中,因此将在页面上呈现为<script>document.write(window._restapiurl);</script>。该语句打印api端点的路径。

我想在页面上执行此语句,这意味着该语句应该打印变量window._restapiurl的值。如果我在页面构建后手动在html中编写<script>标记,则将执行该语句并打印变量的值。

更新

:escape_html => true, :filter_html => true中使用config.rb进行了尝试,但它无效。

更新 我需要在我的语言选择器curl选项卡中执行javascript语句。

更新 即使我删除三重标记```,script标记也不会执行。它只是在页面上打印script语句。

如何执行markdown中编写的javascript代码???因此,每当发布新版本时我都不需要更新api端点路径,我可以通过仅更改变量值来管理它。

2 个答案:

答案 0 :(得分:0)

在md文件中我已经替换了

```
url of api endpoint 
```

以下代码

<pre>
     <script>document.write(window._restapiurl);</script>
</pre>

这将在javascript文档格式的暗盒中执行tripit/slate语句。

答案 1 :(得分:0)

你真的需要把它放在一个代码块中吗?如果不是,只需将脚本标记放在Markdown文件中(或者甚至是FWIW,自己编写<pre><code>)。否则,你不能轻易做到这一点。事实是,默认情况下,Redcarpet的HTML呈现对象将转义代码块内的任何HTML标记。您唯一的选择是实现自定义渲染对象。您可以依赖以下事实:block_code方法产生的代码不会被HTML转义:

class CustomRender < Redcarpet::Render::HTML
  def block_code(code, lang)
    "<pre>" \
      "<code class=\"#{lang}\">#{code}</code>" \
    "</pre>"
  end
end

然后将此对象传递给Redcarpet::Markdown实例:

Redcarpet::Markdown.new(CustomRender, fenced_code_blocks: true)

而且,你可能做错了。如果它只是在您的代码段中插入一些特殊值,那么您可能希望在代码段中使用特殊语法并将其替换为您自己的值。您可以使用给定String#gsub变量上的String#%code再次在自定义渲染对象中执行此操作。

度过美好的一天!