RSS, Atom, and JSON feeds generator plugin for VuePress 1.x
$ npm install -D vuepress-plugin-feed
# or
$ yarn add -D vuepress-plugin-feedAdd vuepress-plugin-feed in your site or theme config file.
// .vuepress/config.js
// or
// .vuepress/theme/index.js
// set your global feed options - override in page frontmatter `feed`
const feed_options = {
  canonical_base: 'https://webmasterish.com',
};
module.exports = {
  plugins: [
    [ 'feed', feed_options ]
  ]
}Page frontmatter.feed is optional.  It can be used to override the defaults.
Check the Page class for more details.
---
title: Page Title
feed:
  enable: true
  title: Title used in feed
  description: Description used in feed
  image: /public/image.png
  author:
    -
      name: Author
      email: [email protected]
      link: http://doamin.tld
  contributor:
    -
      name: Contributor
      email: [email protected]
      link: http://doamin.tld
---
A page is auto added as a feed item if one the following conditions is met:
- frontmatter.feed.enable === true
- frontmatter.type === 'post'
- it resides in whatever the posts_directoriesare set to (the defaults areblogand_posts)
if you need to exclude a particular page that meets one of the conditions above,
you can use frontmatter.feed.enable === false.
Details on how pages are filtered can be found in PLUGIN.is_feed_page().
The PLUGIN.is_feed_page() function is the default way of filtering the pages,
you can override it using is_feed_page option (see Options section below).
See Plugin Option API official docs
You can override default options in 2 ways:
- Global plugin options set in .vuepress/config.jsor.vuepress/theme/index.jsas described in Usage
- Individual page/post frontmatteras shown in Pagefrontmatter
const {
  title,
  description
} = context.getSiteData ? context.getSiteData() : context;
// -----------------------------------------------------------------------------
// Feed class options
// @see: https://github.com/jpmonette/feed#example
const feed_options = {
  title,
  description,
  generator: PLUGIN.homepage,
  // ---------------------------------------------------------------------------
  // the following are auto populated in PLUGIN.get_options()
  // if they are not set as options
  /*
  id,
  link,
  feedLinks,
  */
  // ---------------------------------------------------------------------------
  // ref:
  /*
  title: "Feed Title",
  description: "This is my personal feed!",
  id: "http://example.com/",
  link: "http://example.com/",
  image: "http://example.com/image.png",
  favicon: "http://example.com/favicon.ico",
  copyright: "All rights reserved 2013, John Doe",
  updated: new Date(2013, 6, 14), // optional, default = today
  generator: "awesome", // optional, default = 'Feed for Node.js'
  feedLinks: {
    json: "https://example.com/json",
    atom: "https://example.com/atom"
  },
  author: {
    name: "John Doe",
    email: "johndoe@example.com",
    link: "https://example.com/johndoe"
  }
  */
};
// -----------------------------------------------------------------------------
const default_options = {
  // required; it can also be used as enable/disable
  canonical_base: '',
  // ---------------------------------------------------------------------------
  // Feed class options - @see: https://github.com/jpmonette/feed#example
  // optional - auto-populated based on context.getSiteData()
  feed_options,
  // ---------------------------------------------------------------------------
  // @notes:
  // property name is also the name of the jpmonette/feed package function
  feeds: {
    rss2: {
      enable    : true,
      file_name : 'rss.xml',
      head_link : {
        enable: true,
        type  : 'application/rss+xml',
        title : '%%site_title%% RSS Feed',
      }
    },
    // -------------------------------------------------------------------------
    atom1: {
      enable    : true,
      file_name : 'feed.atom',
      head_link : {
        enable: true,
        type  : 'application/atom+xml',
        title : '%%site_title%% Atom Feed',
      }
    },
    // -------------------------------------------------------------------------
    json1: {
      enable    : true,
      file_name : 'feed.json',
      head_link : {
        enable: true,
        type  : 'application/json',
        title : '%%site_title%% JSON Feed',
      }
    },
  },
  // ---------------------------------------------------------------------------
  // page/post description sources
  // order of what gets the highest priority:
  //
  // 1. frontmatter
  // 2. page excerpt
  // 3. content markdown paragraph
  // 4. content regular html <p>
  description_sources: [
    'frontmatter',
    'excerpt',
    // markdown paragraph regex
    // @todo: needs work
    //
    /^((?:(?!^#)(?!^\-|\+)(?!^[0-9]+\.)(?!^!\[.*?\]\((.*?)\))(?!^\[\[.*?\]\])(?!^\{\{.*?\}\})[^\n]|\n(?! *\n))+)(?:\n *)+\n/gim,
    //
    // this excludes blockquotes using `(?!^>)`
    ///^((?:(?!^#)(?!^\-|\+)(?!^[0-9]+\.)(?!^!\[.*?\]\((.*?)\))(?!^>)(?!^\[\[.*?\]\])(?!^\{\{.*?\}\})[^\n]|\n(?! *\n))+)(?:\n *)+\n/gim,
    // html paragraph regex
    /<p(?:.*?)>(.*?)<\/p>/i,
  ],
  // ---------------------------------------------------------------------------
  // page/post image sources
  // order of what gets the highest priority:
  //
  // 1. frontmatter
  // 2. content markdown image such as ``
  // 3. content regular html img
  image_sources: [
    'frontmatter',
    /!\[.*?\]\((.*?)\)/i,         // markdown image regex
    /<img.*?src=['"](.*?)['"]/i,  // html image regex
  ],
  // ---------------------------------------------------------------------------
  // pages in current directories will be auto added as feed
  // unless they are disabled using their frontmatter
  // this option is used by the default is_feed_page function
  posts_directories: ['/blog/', '/_posts/'],
  // ---------------------------------------------------------------------------
  // function to check if the page is to be used in a feed item
  is_feed_page: PLUGIN.is_feed_page, // function
  // ---------------------------------------------------------------------------
  count: 20,
  // optional sorting function for the entries. 
  // Gets the array entries as the input, expects the sorted array
  // as its output.
  // e.g.:   sort:  entries => _.reverse( _.sortBy( entries, 'date' ) ),
  // Don't forget to do a `const _ = require('lodash');` to be able to use `_`!
  sort: entries => entries,
  // ---------------------------------------------------------------------------
  // supported - use in config as needed
  // category
  // contributor
};- VuePress official plugin docs
- VuePress official Front Matter
- jpmonette/feed
- RSS 2.0 specificatiion
- Atom feed
- JSON feed
MIT © webmasterish