4

Jekyll テンプレート内に別のドメインからの html ファイルを含めることは可能ですか? もしそうなら、構文はどうなりますか?

私は Ruby や Jekyll の開発者ではありません。多かれ少なかれ別の人に代わって質問しているので、答えが明らかな場合はご容赦ください。少なくとも、最初の調査では答えを見つけることができませんでした。

本質的には、別のドメインからフッターのマークアップを取得しようとしています。これが本番環境のしくみなので、テンプレートの成果物で実際にシミュレートしようとしているだけです。

乾杯

4

3 に答える 3

2

テンプレート自体の中でこれを行うことはできません。ただし、リモート ページのマークアップをスクレイピングするカスタム Liquid タグを定義し、そのタグをテンプレートに入れることはできます。これは、eg という名前のファイルにあります。plugins/remote_footer.rb

require 'nokogiri'
require 'open-uri'
require 'uri'

module Jekyll

  class RemoteFooterTag < Liquid::Tag

    def initialize(tag_name, markup, tokens)
      #markup is what is defined in the tag. Lets make it a URL so devs 
      #don't have to update code if the URL changes.
      url = markup

      #check if the URL is valid
      if url =~ URI::regexp
        #grab the remote document with nokogiri
        doc = Nokogiri::HTML(open(url))

        #search the document for the HTML element you want
        @node = doc.at_xpath("//div[@id='footer']")
      else
        raise 'Invalid URL passed to RemoteFooterTag'
      end

      super
    end

    def render(context)
      output = super
      if @node 
        node.to_s
      else
        "Something went wrong in RemoteFooterTag"
      end
    end
  end
end

Liquid::Template.register_tag('remote_footer', Jekyll::RemoteFooterTag)

そして、あなたのテンプレートで:

{% remote_footer http://google.com %}

私はこれをすぐにまとめて実行するかどうかを確認しませんでしたが、うまくいけばそれで十分です。これは、リキッド パーサーがページで実行されるときに 1 回実行され、リモート要素が変更された場合、Jekyll サイトが再構築されるまで反映されないことに注意してください。

于 2013-02-19T17:05:58.213 に答える
2

私はこの問題に遭遇したばかりで、私が持っていたすべてのユースケースに対処する有効なソリューションが見つからなかったため、独自のプラグインを作成しました.

注: これは私が書いた最初の ruby​​ です。

require 'nokogiri'
require 'open-uri'
require 'uri'

class Jekyll::IncludeRemoteTag < Jekyll::Tags::IncludeTag
  @@remote_cache = {}

  def initialize(tag_name, markup, tokens)
    super
    @url = @file
  end

  def validate_url(url)
    if url !~ URI::regexp
      raise ArgumentError.new <<-eos
Invalid syntax for include_remote tag. URL contains invalid characters or sequences:

#{url}

Valid syntax:

#{syntax_example}

eos
    end
  end

  def syntax_example
    "{% #{@tag_name} http://domain.ltd css=\".menu\" xpath=\"//div[@class='.menu']\" param=\"value\" param2=\"value\" %}"
  end

  def render(context)
    @url = render_variable(context) || @url
    validate_url(@url)

    if @params
      validate_params
      @params = parse_params(context)
    end

    xpath = @params['xpath']
    css = @params['css']

    if ! html = @@remote_cache["#{@url}_#{xpath}"]
      # fetch remote file
      page = Nokogiri::HTML(open(@url))

      # parse extract xpath/css fragments if necessary
      node = page.at_xpath(xpath) if xpath
      node = page.css(css) if css
      node = page if !node

      raise IOError.new "Error while parsing remote file '#{@url}': '#{xpath||css}' not found" if !node

      # cache result
      html = @@remote_cache["#{@url}_#{xpath}"] = node.to_s
    end

    begin
      partial = Liquid::Template.parse(html)

      context.stack do
        context['include'] = @params
        partial.render!(context)
      end
    rescue => e
      raise Jekyll::Tags::IncludeTagError.new e.message, @url
    end
  end
end

Liquid::Template.register_tag('include_remote', Jekyll::IncludeRemoteTag)

そして、次のように使用します。

<!-- fetch header.html -->
{% assign url = 'http://mything.me/_includes/header.html' %}
{% include_remote {{ url }} %}

<!-- fetch menu.html and extract div.menu -->
{% include_remote 'http://mything.me/_includes/menu.html' css="div.menu" links=site.data.menu %}

<!-- fetch menu.html and extract div.menu (xpath version) -->
{% include_remote 'http://mything.me/_includes/menu.html' xpath="div[@class='menu']" links=site.data.menu %}

基本的には通常のインクルード ファイルとまったく同じように機能しますが、リモートです。

ここからダウンロードできます: https://gist.github.com/kilianc/a6d87879735d4a68b34f

ライセンスMIT。

于 2015-11-28T03:44:38.043 に答える