如何在自定义插件中使用 `relative_url`

How to use `relative_url` inside custom plugin

我正在尝试在插件中使用 relative_url 过滤器。

module Jekyll
  module Tags
    class MyNewTag < Liquid::Block

      include Jekyll::Filters::URLFilters

      def initialize(tag_name, block_options, liquid_options)
        super
        @class = block_options.strip
      end

      def render(context)

        context.stack do
          context["class"] = @class
          @content = super
          path_js = Jekyll::Filters::URLFilters::relative_url("assets/custom.min.css")
          path_css = Jekyll::Filters::URLFilters::relative_url("assets/custom.min.js")
        end

        output = <<~EOS
        <link rel="stylesheet" href="#{path_js}">
        <script src="#{path_css}"></script>

        EOS
      end
    end
  end
end

Liquid::Template.register_tag('MyNewTag', Jekyll::Tags::MyNewTag)

但是,Ruby 显示 NoMethodError: undefined method relative_url' for Jekyll::Filters::URLFilters:Module` - 因此我无法使用它。

我应该如何包含 relative_url 过滤器,以便我可以在我的代码中使用它?

事实证明,错误是由于缺少上下文变量引起的,必须由@context = context

显式传递

它有效,如果它是这样格式化的:

module Jekyll
  module Tags
    class MyNewTag < Liquid::Block

      include Jekyll::Filters::URLFilters

      def initialize(tag_name, block_options, liquid_options)
        super
        @class = block_options.strip
      end

      def render(context)

        context.stack do
          context["class"] = @class
          @content = super
          @context = context
          @path_js = relative_url("assets/custom.min.css")
          @path_css = relative_url("assets/custom.min.js")
        end

        output = <<~EOS
        <link rel="stylesheet" href="#{@path_js}">
        <script src="#{@path_css}"></script>

        EOS
      end
    end
  end
end

Liquid::Template.register_tag('MyNewTag', Jekyll::Tags::MyNewTag)