Jekyll - generating JSON files alongside the HTML files

前端 未结 3 633
天涯浪人
天涯浪人 2020-12-14 12:00

I\'d like to make Jekyll create an HTML file and a JSON file for each page and post. This is to offer a JSON API of my Jekyll blog - e.g. a post can be accessed either at

3条回答
  •  陌清茗
    陌清茗 (楼主)
    2020-12-14 12:36

    Take a look at JekyllBot and the following code.

    require 'json' 
    
    module Jekyll
    
      class JSONPostGenerator < Generator
        safe true
    
        def generate(site)
    
          site.posts.each do |post|
            render_json(post,site)    
          end
    
          site.pages.each do |page|
            render_json(page,site)    
          end
    
        end
    
        def render_json(post, site)
    
          #add `json: false` to YAML to prevent JSONification
          if post.data.has_key? "json" and !post.data["json"]
            return
          end
    
          path = post.destination( site.source )
    
          #only act on post/pages index in /index.html
          return if /\/index\.html$/.match(path).nil?
    
          #change file path
          path['/index.html'] = '.json'
    
          #render post using no template(s)
          post.render( {}, site.site_payload)
    
          #prepare output for JSON
          post.data["related_posts"] = related_posts(post,site)
          output = post.to_liquid
          output["next"] = output["next"].id unless output["next"].nil?
          output["previous"] = output["previous"].id unless output["previous"].nil?
    
          #write
          #todo, figure out how to overwrite post.destination 
          #so we can just use post.write
          FileUtils.mkdir_p(File.dirname(path))
          File.open(path, 'w') do |f|
            f.write(output.to_json)
          end
    
        end
    
        def related_posts(post, site)
    
          related = []
          return related unless post.instance_of?(Post)
    
          post.related_posts(site.posts).each do |post|
            related.push :url => post.url, :id => post.id, :title => post.to_liquid["title"]
          end
    
          related
    
        end
      end
    end
    

    Both should do exactly what you want.

提交回复
热议问题