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

我正在与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]() and *another* one [to second page](). / ERB inside HAML tag; markdown is not processed => :| .haml (2) This is just some text with [ERB link to first page]() and *another* one [to second page](). / 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[AZ])/,"") 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)中提供相同的输出。

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

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

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

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

我的第二个问题:为什么在B中描述的情况下,Middleman不会自动处理降价?

我认为回答我的主要问题需要知道Ruby和Tilt,而我的第二个问题的答案需要了解Middleman。 虽然我的主要问题的解决方案会很好,但是对次要问题的回答可能允许完全跳过Tilt,从而以更简单的方式解决问题。

由于您已经正确地进行了HAML解析,并且当您呈现逐字链接时,它可以使用帮助程序直接注入链接而无需转到ERB。 由于HAML已经运行了Ruby代码,我认为没有必要通过ERB传递它。 我认为eval会让你获得与使用ERB相同的效果。 像这样的东西:

 def refonly(text) text.scan(/ref\.(page[AZ])/).each do |groups| page_name = groups[0] text.gsub!(/ref\.#{page_name}/, eval("data.pages.#{page_name}.link")) end text end 

编辑:扫描文本将允许您获取每个page_name,以便您可以遍历每个页面并将每个页面引用替换为其链接。