首页 文章

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

提问于
浏览 504
1

我正在 Build 一个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)发挥作用 .

我直接在我的_2695917中评论了每段代码的结果:

请注意,必须在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)中提供相同的输出 .

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

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

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

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

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

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

1 回答

  • 1

    由于您已经正确地进行了HAML解析,并且当您渲染逐字链接时它可以正常工作,请尝试使用帮助程序直接注入链接而无需转到ERB . 由于HAML已经运行了Ruby代码,我认为没有必要通过ERB传递它 . 我认为 eval 将允许您获得与使用ERB相同的效果 . 像这样的东西:

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

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

相关问题