stackoverflow.com/q/45692859/1226389

даю сайт сперекупщик, Я храню много информации в файлах данных, так как собираюсь использовать одну и ту же информацию на нескольких страницах. (Частичные варианты не будут работать для меня, поскольку один и тот же текст из данных может использоваться с разными тегами HTML или быть слегка изменен для разных страниц.)

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

data/pages.yaml:

pageA:
  link: /it-can-change-A.html
  name: PageA name
  info: Some other related info

pageB:
  link: /subject-to-change-B.html
  name: PageB name
  info: Some other related info

pageC:
  link: /some-C.html
  name: PageC name
  info: Some other related info

data/faq.yaml:

testcase: Some text with [internal link to page A](ref.pageA). And *another* [internal reference](ref.pageB).

verbatim: Some text with [internal link to page A](/it-can-change-A.html). And *another* [internal reference](/subject-to-change-B.html).

Пытаясь найти причину этой проблемы, я протестировал различные способы «извлечь» относительные ссылки из файла данных и поместить их в шаблон HAML. Моя конечная цель - заставить дело (5) работать.

Я прокомментировал результаты каждого куска кода прямо в моемtest.html.md.erb.haml:

Обратите внимание, что HAML должен обрабатываться до ERB, поэтому .haml должен быть последним расширением. Если расширения .erb и .haml поменялись местами, приведенные ниже случаи (3) и (4) приведут к разным результатам.

/ Pure ERB; ERB is processed before markdown => :)
(1) This is just some text with [ERB link to first page](<%= data.pages.pageA.link %>) and *another* one [to second page](<%= data.pages.pageB.link %>). 

/ ERB inside HAML tag; markdown is not processed => :|
.haml
    (2) This is just some text with [ERB link to first page](<%= data.pages.pageA.link %>) and *another* one [to second page](<%= data.pages.pageB.link %>). 

/ Helper used WITHOUT a tag; ERB is processed before markdown => :)
(3)
= refonly(data.faq.testcase) 

/ Helper used WITH a tag; ERB is processed, but markdown is not => :|
.question1
    (4)
    = refonly(data.faq.testcase)

/ "Tilt-powered" helper used WITHIN a tag; trying to process markdown with Tilt results in "%=%20data.pages.pageA.link%20%" links. Expected behavior: ERB should be processed first, then Tilt should process markdown with actual relative links being the same as in .question1 above => :(
.question2
    (5)
    = mymarkdown(data.faq.testcase)

/ Helper with Tilt to process verbatim text; markdown is processed correctly => :)
.question3
    (6)
    = justmarkdown(data.faq.verbatim)

Помощники, используемые в шаблоне выше:

def refonly(text)
    text.gsub(/ref\.(page[A-Z])/,"<\%= data.pages.\\1.link %>")
end

def mymarkdown(text)
    newtext = refonly(text)
    Tilt['markdown'].new(context: @app) { newtext }.render
end

def justmarkdown(text)
    Tilt['markdown'].new(context: @app) { text }.render
end

Целью первого помощника является изменение простой для записи ссылки внутри файла данных (ref.pageName) на код ERB, аналогичный тому, который используется в (1). Целью второго помощника является визуализация уценки в случае, когда.md Само расширение шаблона не может отобразить его автоматически. Цель последнего помощника состоит в том, чтобы показать, что Tilt может правильно отображать текст в (6), но когда он принимает тот же текст в качестве переменной, он не может обеспечить такой же вывод в (5).

A. Когда я использую «чистый ERB» (1), илиrefonly хелпер без тега HAML (3), вывод будет таким, как ожидалось: относительный путь получен из файла данных, а затем обработка уценки обрабатывается механизмом уценки по умолчанию (kramdown) благодаря.md расширение шаблона.

B. Когда я пытаюсь использовать тег HAML, либо непосредственно с кодом ERB (2), либо сrefonly helper (4), ERB обрабатывается правильно и помещается в вывод. Однако по какой-то причине уценка не обрабатывается автоматически, даже если.md расширение используется сразу после.htmlследовательно, уценка должна быть обработана после окончания битов HAML и ERB.

C. Чтобы «форсировать» рендеринг уценки, я использую Tilt во втором помощнике. Мое намерение состояло в том, чтобы передать текст, возвращенныйrefonly (который имеет правильный синтаксис уценки с предполагаемой ссылкой, извлеченной из данных) в Tilt. Я ожидал, что Tilt просто отобразит текст, переданный ему в (5), так же, как в (6). Вместо этого результирующая ссылка указывает на%=%20data.pages.pageA.link%20%, который выглядит как HTML-код для дословного отображения кода ERB. Итак, похоже на прохождениеnewtext переменная to Tilt как-то останавливает обработку ERB, а код ERB передается непосредственно в уценку.

мойпервичный Вопрос в том, как я могу убедиться, что Tilt получает правильный текст с относительной ссылкойrefonly) и дает ожидаемый результат в (5)?

мойвторичный вопрос: почему уценка не обрабатывается автоматически Middleman в случаях, описанных в разделе B.?

Я предполагаю, что ответ на мой основной вопрос требует знания Ruby и Tilt, в то время как ответ на мой дополнительный вопрос требует знания Middleman. Хотя решение моей первичной проблемы было бы великолепным, ответ на вторичный вопрос может позволить вообще пропустить Tilt и, следовательно, решить проблему проще.

Ответы на вопрос(0)

Ваш ответ на вопрос