文章

修复附件链接为绝对路径

修复附件链接为绝对路径

chirpy在识别到链接为png等图片格式后, 会自动将md格式的非/开头的路径改成/开头的路径, 功能覆盖不全面, 当附件后缀不是上面的情况下, 网页中点击该链接会显示网页不存在或文件不存在, 因此, 此插件就是为了解决这个问题而诞生的, 解决方法也很简单, 将所有转化后的附件链接前面补全/就行.

使用方法

在_plugins文件夹中创建一份rb文件

1
/_plugins/fix_absolute_path.rb

内容为

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
# Jekyll插件:为相对链接添加根路径前缀

# 文件名:_plugins/add_root_prefix_to_links.rb

  

module Jekyll

    class RootPrefixLinkAdder < Generator

      safe true

      priority :normal

      def generate(site)

        # 遍历所有页面和文章

        all_docs = site.pages + site.posts.docs + site.documents

        all_docs.each do |doc|

          next unless doc.content.respond_to?(:gsub)

          # 检查文档是否包含链接

          if doc.content.match(/<a\s+/i)

            original_content = doc.content

            # 处理HTML中的链接标签

            doc.content = doc.content.gsub(/(<a\s+[^>]*href=["']([^"']+)["'][^>]*>)/mi) do |match|

              full_match = $1

              href_url = $2

              # 检查链接是否需要添加根路径前缀

              if should_add_root_prefix?(href_url)

                # 添加根路径前缀

                modified_href = ensure_leading_slash(href_url)

                # 替换原href值

                modified_match = full_match.sub(/href=["']#{Regexp.escape(href_url)}["']/, "href=\"#{modified_href}\"")

                puts "RootPrefixLinkAdder: 为 #{get_doc_identifier(doc)} 中的链接 #{href_url} 添加了根路径前缀"

                modified_match

              else

                full_match

              end

            end

            # 如果内容发生变化,记录一下

            if original_content != doc.content

              puts "RootPrefixLinkAdder: 处理了文档 #{get_doc_identifier(doc)} 中的链接"

            end

          end

        end

      end

      private

      def should_add_root_prefix?(url)

        # 不处理外部链接

        return false if url.start_with?('http://', 'https://', '//')

        # 不处理锚点链接

        return false if url.start_with?('#')

        # 不处理javascript或mailto链接

        return false if url.start_with?('javascript:', 'mailto:', 'tel:', 'sms:')

        # 只处理不以/开头的相对路径链接

        !url.start_with?('/')

      end

      def ensure_leading_slash(path)

        return path if path.start_with?('/')

        "/#{path}"

      end

      def get_doc_identifier(doc)

        # 为不同类型的文档获取合适的标识符

        if doc.respond_to?(:id)

          doc.id

        elsif doc.respond_to?(:relative_path)

          doc.relative_path

        elsif doc.respond_to?(:path)

          doc.path

        else

          "unknown_document"

        end

      end

    end

    # 同时使用钩子在渲染后处理,确保处理所有转换后的内容

    Hooks.register [:documents, :pages], :post_render do |doc, payload|

      # 只处理包含链接的HTML输出

      if doc.output && doc.output.include?('<a ')

        original_output = doc.output

        # 处理HTML中的链接标签

        doc.output = doc.output.gsub(/(<a\s+[^>]*href=["']([^"']+)["'][^>]*>)/mi) do |match|

          full_match = $1

          href_url = $2

          # 检查链接是否需要添加根路径前缀

          if should_add_root_prefix?(href_url)

            # 添加根路径前缀

            modified_href = ensure_leading_slash(href_url)

            # 替换原href值

            modified_match = full_match.sub(/href=["']#{Regexp.escape(href_url)}["']/, "href=\"#{modified_href}\"")

            puts "RootPrefixLinkAdder(post_render): 为 #{get_doc_identifier(doc)} 中的链接 #{href_url} 添加了根路径前缀"

            modified_match

          else

            full_match

          end

        end

        # 如果内容发生变化,记录一下

        if original_output != doc.output

          puts "RootPrefixLinkAdder(post_render): 处理了 #{get_doc_identifier(doc)} 中的链接"

        end

      end

      doc # 返回文档对象

    end

    def self.should_add_root_prefix?(url)

      # 不处理外部链接

      return false if url.start_with?('http://', 'https://', '//')

      # 不处理锚点链接

      return false if url.start_with?('#')

      # 不处理javascript或mailto链接

      return false if url.start_with?('javascript:', 'mailto:', 'tel:', 'sms:')

      # 只处理不以/开头的相对路径链接

      !url.start_with?('/')

    end

    def self.ensure_leading_slash(path)

      return path if path.start_with?('/')

      "/#{path}"

    end

    def self.get_doc_identifier(doc)

      # 为不同类型的文档获取合适的标识符

      if doc.respond_to?(:id)

        doc.id

      elsif doc.respond_to?(:relative_path)

        doc.relative_path

      elsif doc.respond_to?(:path)

        doc.path

      else

        "unknown_document"

      end

    end

  end
本文由作者按照 CC BY 4.0 进行授权