倾斜(kramdown)在渲染降价时阻止ERB处理

时间:2017-06-28 08:44:24

标签: ruby haml erb middleman kramdown

我正在使用Middleman建立一个网站。我在数据文件中存储了大量信息,因为我将在多个页面上使用相同的信息。 (部分对我不起作用,因为数据中的相同文本可以与不同的HTML标记一起使用,或者针对不同的页面稍作修改。)

我想在数据文件中编写 markdown ,然后在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

中评论了每段代码的结果

请注意,必须在ERB之前处理HAML,因此.haml必须是最后一个扩展名。如果.erb和.haml扩展名切换位置,下面的case(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模板扩展本身无法自动呈现它的情况下呈现markdown。最后一个帮助器的目的是显示Tilt可以在(6)中正确呈现逐字文本,但是当它接受与变量相同的文本时,它不能在(5)中提供相同的输出。

一个。当我使用“纯ERB”(1)或refonly助手没有HAML标签(3)时,输出是预期的:相对路径来自数据文件,然后降价处理默认降价引擎(kramdown)谢谢到.md模板扩展名。

B中。当我尝试使用HAML标记时,无论是直接使用ERB代码(2),还是使用refonly帮助程序(4),都会正确处理ERB并将其放入输出中。但是,即使在.md之后直接使用.html扩展名,也不会出于某种原因自动处理降价,因此应在HAML和ERB位完成后处理降价。

℃。为了“强制”降价渲染,我在第二个助手中使用了Tilt。我的目的是将refonly返回的文本(具有正确的降价语法和从数据中提取的预期链接)传递给Tilt。我的期望是Tilt会简单地在(5)中呈现传递给它的逐字文本,就像在(6)中一样。相反,结果链接指向%=%20data.pages.pageA.link%20%,这似乎是HTML代码逐字显示ERB代码。因此,看起来将newtext变量传递给Tilt会以某种方式停止ERB处理并将ERB代码直接传递给markdown。

我的主要问题是:如何确保Tilt获取具有相对链接的正确文本(由refonly返回)并在(5)中生成预期输出?< / p>

我的次要问题:为什么在B中描述的情况下,Middleman不会自动处理降价。

我认为回答我的主要问题需要知道Ruby和Tilt,而我的第二个问题的答案需要了解Middleman。虽然我的主要问题的解决方案会很好,但回答第二个问题可能会完全跳过Tilt,从而更容易解决问题。

0 个答案:

没有答案