我正在使用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,从而更容易解决问题。