parse/interface/register.js

import {FormatParser} from './parser'
import {addTypeParser, removeTypeParser} from './type'
import {addDataParser, removeDataParser} from './data'

const formats = {}

/**
 * See the relevant tutorial: {@tutorial input_plugins}
 *
 * @access public
 * @memberof Cite.plugins.input
 *
 * @param {Cite.plugins.input~format} format - input format name
 * @param {Cite.plugins.input~parsers} parsers - parsers
 *
 * @tutorial input_plugins
 */
export const add = (format, parsers) => {
  let formatParser = new FormatParser(format, parsers)
  formatParser.validate()

  let index = formats[format] = {}

  if (formatParser.typeParser) {
    addTypeParser(format, formatParser.typeParser)
    index.type = true
  }
  if (formatParser.dataParser) {
    addDataParser(format, formatParser.dataParser)
    index.data = true
  }
  if (formatParser.asyncDataParser) {
    addDataParser(format, formatParser.asyncDataParser)
    index.asyncData = true
  }
}

/**
 * @access public
 * @memberof Cite.plugins.input
 *
 * @param {Cite.plugins.input~format} format - input format name
 */
export const remove = (format) => {
  let index = formats[format]

  if (!index) {
    return
  }

  if (index.type) {
    removeTypeParser(format)
  }
  if (index.data) {
    removeDataParser(format)
  }
  if (index.asyncData) {
    removeDataParser(format, true)
  }

  delete formats[format]
}

/**
 * @access public
 * @memberof Cite.plugins.input
 * @param {Cite.plugins.input~format} format - input format name
 * @returns {Boolean} input format is registered
 */
export const has = (format) => format in formats

/**
 * @access public
 * @memberof Cite.plugins.input
 * @returns {Array<Cite.plugins.input~format>} input format is registered
 */
export const list = () => Object.keys(formats)