уценка redcarpet - выполнить код javascript

Я создал документацию, используя tripit/slate. Все содержимое документации находится в файле .md. slate использует механизм уценки redcarpet. Теперь, когда я помещаю тег <script>, как показано ниже, в уценке:

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

он будет преобразован в &lt;script&gt;document.write(window._restapiurl);&lt;/script&gt; в html. И оператор находится в теге <pre>, поэтому на странице он будет отображаться как <script>document.write(window._restapiurl);</script>. Оператор печатает путь конечной точки API.

Я хочу выполнить этот оператор на странице, что означает, что оператор должен печатать значение переменной window._restapiurl. Если я вручную напишу тег <script> в html после сборки страницы, оператор будет выполнен и напечатает значение переменной.

Обновление:

пытался с :escape_html => true, :filter_html => true в config.rb, но это не сработало.

дополнительные обновления Мне нужно выполнить оператор javascript на вкладке выбора языка curl.

больше обновлений Даже если я удалю тройные галочки ```, тег script не будет выполняться. Он просто печатает оператор script на странице.

Как выполнить код JavaScript, написанный в уценке ??? Так что мне не нужно обновлять путь к конечной точке API всякий раз, когда выпускается новая версия, и я могу управлять им, изменяя только значение переменной.


person Valay    schedule 08.10.2014    source источник
comment
Есть ли шанс заставить его работать???   -  person Valay    schedule 08.10.2014
comment
вы не должны использовать тройные галочки (```) до и после вашего кода, поскольку они фактически используются для отображения кода.   -  person mb21    schedule 08.10.2014
comment
@mb21- я использовал ``` для языковой вкладки curl.   -  person Valay    schedule 09.10.2014
comment
@mb21 - есть обновления???   -  person Valay    schedule 09.10.2014
comment
@mb21 - Даже если я удалю тройные галочки ```, тег script не будет выполнен. Он просто печатает заявление на странице.   -  person Valay    schedule 10.10.2014
comment
escape_html должно быть false, а не верно. Но в любом случае это наводит на плохие мысли. Вся идея уценки состоит в том, чтобы позволить людям безопасно использовать подмножество html без написания HTML. Если вы доверяете людям добавлять теги script, просто дайте им обычное текстовое поле HTML.   -  person Mohamad    schedule 10.10.2014
comment
@Mohamad - мне не нужно давать людям добавлять тег script. Я напишу <script>document.write(window._restapiurl);</script> в md, который нужно выполнить на отображаемой html-странице.   -  person Valay    schedule 10.10.2014
comment
@mb21 - нужно поместить оператор <script> в тег <pre>, чтобы он был выполнен.   -  person Valay    schedule 10.10.2014


Ответы (2)


В файле md я заменил

```
url of api endpoint 
```

с кодом ниже

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

Это выполнит оператор javascript в темном ящике формата документации tripit/slate.

person Valay    schedule 10.10.2014

Вам действительно нужно поместить это в блок кода? Если нет, просто поместите тег script в файл Markdown (или даже, FWIW, напишите <pre><code> самостоятельно). В противном случае вы не сможете легко это сделать. Дело в том, что по умолчанию объект рендеринга HTML Redcarpet будет экранировать любой тег 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.

Хорошего дня!

person robin850    schedule 11.10.2014