Jekyll:如何使用链接到内部Markdown文件

4

带有指向Folder/file.md的链接的md文件。

当jekyll生成索引时,文件的链接仍然是folder/file.md,因此无法连接到生成的file.html。jekyll能否用它们对应的html文件替换markdown中的链接?

我真的想保持我的文件夹结构(大约7个子文件夹,每个子文件夹都有3个markdown文件)。


因为我完全无法理解这个独立的问题(而我很想能够理解它),所以我被踩了。 - cregox
6个回答

9

答案自2016年12月以来是使用jekyll-relative-links插件。

如果您正在GitHub页面上托管,它是一个{{link3:白名单插件},所以您可能已经拥有它了。


如果您没有使用GitHub Pages,则需要按照以下安装说明进行安装(从README中获取):
1.将以下内容添加到您网站的Gemfile中:
gem 'jekyll-relative-links'

2.将以下内容添加到您网站的配置文件中:

gems:
  - jekyll-relative-links

真的很棒!但是...我想知道是否有更短的方法来完成这个任务...我的意思是所有的.md文件都应该有一个默认的永久链接,而不需要.md,这样[foo](bar)就可以工作了。然后[[bar]]也可以工作!你有什么想法吗? - cregox
请注意,如果您不使用Github Pages或不想使用单独的插件,则link标签是内置的,并且从Jekyll 4.0开始,使用起来更加简单。 - nrflaw
@nrflaw 哎呀,那太久远了!抱歉,我不再关心这个了。我仍然在使用Jekyll,但只是作为遗留问题,而我正在迁移到其他地方……它很快就会随着微软的EEE和GitHub一起消失。也许你会有兴趣退后几步,看看周围!(本意是回复下面的Antonio,保留此信息) - cregox

4
您要查找的标签是{% link %},它出现在2016年。
如果您使用{% link _funkyCollection/banjo.md %},它将生成正确的路径到输出文件funkyCollection / banjo.html,或funkyCollection / banjo / index.html,或在任何地方结束的任何内容。请注意保留HTML标记。

@vossad01在其他答案中所说的含义太简短了。 - cregox
内置的,不是插件。因此与@cregox不同。因此答案更短。 - Antonio
啊,那太久远了!对不起,我已经不再关心这个了。我还在使用Jekyll,但只是作为遗留问题,因为我正在迁移到其他地方……在Microsoft的EEE之后,它很快就会和GitHub一起消亡。也许你有兴趣退后几步,看看周围! - cregox

3
这是我用 jekyll 3.8.5 解决这个问题的方法。
对于根目录中的链接:/file.md
---
layout: page
title: Root File
permalink: /file/
---

This file is in root directory.

对于子目录中的链接: /folder/file.md

---
layout: page
title: SubDir File
permalink: /folder/file/
---

This file is in sub-directory.

现在需要将这些文件链接起来:
[Root File]({{site.baseurl}}/file/))

[Sub Dir File]({{site.baseurl}}/folder/file/)

希望这能帮到某些人。

你真的需要 site.baseurl 吗?另外,你有没有想过是否可能将 [file](/file) 链接到一些更短的“维基”样式,比如 [[file]] - cregox

2
我写了一个简单的插件来解决这个问题。将它放在_plugins/目录下,并将链接引用*.md文件(这样GitHub渲染链接就会起作用);如果你使用jekyll构建它(当你能够运行插件时),链接会被更改为*.html。因为GitHub不运行插件,所以这个方法不适用。
module ChangeLocalMdLinksToHtml
  class Generator < Jekyll::Generator
    def generate(site)
      site.pages.each { |p| rewrite_links(site, p) }
    end
    def rewrite_links(site, page)
      page.content = page.content.gsub(/(\[[^\]]*\]\([^:\)]*)\.md\)/, '\1.html)')
    end
  end
end

虽然不完美(我相信你可以欺骗正则表达式),但它已经足够满足我的需求。


1

Folder/file.md页面将会创建一个_site/Folder/file.html页面。

因此,当您链接到此页面时,链接应为[Link to page]({{site.baseurl}}/Folder/file.html)而不是[Link to page]({{site.baseurl}}/Folder/file.md)

Jekyll永远不会将file.md重写为url中的file.html。因此,您必须自己设置链接目标到生成的page.url,这通常是一个html文件,但也可以是css、je、json等。

如果您在任何file.md中使用permalink: /folder/folder/,它将生成一个可通过[Link to page]({{site.baseurl}}/folder/folder/)访问的/folder/folder/index.html文件。


因此,链接将始终仅通过Github作为md链接或通过Github页面作为HTML链接工作,但不能同时使用两种方式,因为它们不能同时导航。 - James Robinson
当运行"jekyll build"时,我会在{root}/folder/file/index.html处生成文件。 - James Robinson
Github和Github Pages是两个完全独立的东西,具有不同的规则。Github显示渲染的md文件,但不修改它们。使用Jekyll的Github Pages正在进行构建,它解析md文件并生成html页面。 - David Jacquel
听起来和Ashwin的答案的一样,如果你删除site.baseurl,它也可以工作,@james。 - cregox

0

我遇到了这个问题,编写了一个基本的Jekyll/Kramdown插件。它比正则表达式方法更不容易出错。

只要你的链接不以http://或类似的方式开头,并以.md结尾,它就会将链接转换为它们的小写和连字符名称。

当然,你也可以根据自己的需要修改这种行为。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接