Запретить Redcarpet синтаксический анализ определенной функции уценки

Я использую Redcarpet для разбора и рендеринга уценки, хотя мне нужны определенные изменения поведения по умолчанию. Например, хотя мне и нужна автоссылка, мне нужно, чтобы она не связывала ничего в формате, похожем на адрес электронной почты. Для этого я использую этот собственный класс рендерера:

class HTMLRenderer < Redcarpet::Render::HTML
  def block_code(code, language)
    "<pre><code>#{encode(code).gsub("\n", "<br/>")}</code></pre>"
  end

  def autolink(link, link_type)
    return link if link_type == :email
    Formatter.instance.link_url(link)
  end

  private

  def html_entities
    @html_entities ||= HTMLEntities.new
  end

  def encode(html)
    html_entities.encode(html)
  end
end

Следующее изменение, которое мне нужно сделать, это вообще не пытаться обрабатывать списки. То есть, если я ввожу его в этой форме:

- element 1
- element 2
- element 3

Чего я не хочу, так это:

  • элемент 1
  • элемент 2
  • элемент 3

Я хочу, чтобы он оставил список нетронутым:

- элемент 1
- элемент 2
- элемент 3

Во-первых, я попытался решить эту проблему очень похоже на то, как я предотвратил автоматическую привязку электронных писем:

def list(contents, list_type)
  contents
end

def list_element(text, list_type)
  text
end

Но в этом случае, если я дам ему список примеров из предыдущего, я получу этот вывод:

элемент1элемент2элемент3

Хотя я мог бы обойти это, просто добавив новые строки обратно и добавив "- " перед каждым элементом, я хочу сохранить определенный символ, который использовался для создания списка, который может быть любым из -+* (или числом в случае упорядоченный список).

Итак, вывод, который я сделал, заключается в том, что возиться с визуализатором — неправильное решение; к моменту рендеринга текста я уже потерял нужную мне информацию. Я думаю, что мне следует обратить внимание на изменение поведения парсера. К сожалению, несмотря на изобилие документации и примеров изменения поведения средства визуализации, я не нашел ничего подобного для изменения поведения анализатора, кроме поддерживаемых флагов.

Как полностью отключить синтаксический анализ функции уценки?


person undergroundmonorail    schedule 02.07.2020    source источник


Ответы (1)


Я нашел решение, хотя оно мне не особенно нравится.

def preprocess(document)
  document.gsub!(/^(\s*)(-|\+|\*) /, '\1\\\\\2 ')
  document.gsub(/^(\s*\d+)\. /, '\1\. ')
end

Используя препроцессор, я могу избежать всего, что в конечном итоге станет списком. Однако я бы предпочел более надежное решение.

person undergroundmonorail    schedule 02.07.2020