UNPKG

front-matter-markdown

Version:

get the config and toc object from the markdown string.

89 lines (75 loc) 2.81 kB
isArray = require('util-ex/lib/is/type/array') isString = require('util-ex/lib/is/type/string') isObject = require('util-ex/lib/is/type/object') isFunction = require('util-ex/lib/is/type/function') defineProperty = require('util-ex/lib/defineProperty') extend = require('util-ex/lib/_extend') matter = require('gray-matter') markdown = require('./markdown') getTocFromList = require('./markdown/get-toc-from-list') getToc = require('./markdown/get-toc-from-heading') headingFilter = require('./gen-heading-filter') getKeys = Object.keys gAliases = {} # the config options aliases assignDefaults = (aOptions, aConfig)-> for k in getKeys gAliases if aConfig[k]? v = gAliases[k] aOptions[v] ?= aConfig[k] aOptions getNonNullKeys = (aObject)-> result = getKeys(aObject).filter (k)->aObject[k]? linksToData = (aLinks)-> result = {} for k,v of aLinks if getNonNullKeys(v).length is 1 result[k] = v.href else result[k] = v result module.exports = fmMarkdown = (aContent, aOptions)-> if isObject aOptions aOptions = extend strict:true, aOptions else aOptions = strict:true if aOptions.strict result = matter(aContent, aOptions) else try result = matter(aContent, aOptions) catch err result = content:aContent, data: error: err vSkipSize = aContent.length - result.content.length aContent = result.content result = result.data result.skipSize = vSkipSize if vSkipSize > 0 return result unless aContent unless result.content or aOptions.content is false defineProperty result, 'content', aContent assignDefaults(aOptions, result) if isString aOptions.heading headings = [aOptions.heading] else if isArray aOptions.heading headings = aOptions.heading else headings = ['toc', /table of content/, 'summary'] compiled = markdown.lexer aContent defineProperty result, '$compiled', compiled unless aOptions.content is false result = extend result, linksToData compiled.links if aOptions.links and compiled.links if aOptions.toc toc = getTocFromList(compiled, headings) if !(toc and toc.contents and toc.contents.length) and aOptions.headingsAsToc aOptions = aOptions.headingsAsToc aOptions = {} unless isObject aOptions aOptions.filter = headingFilter headings, aOptions.filter toc = getToc(compiled, aOptions) extend result, toc if toc and toc.contents and toc.contents.length result fmMarkdown.setOptionAlias = (aOptionName, aAlias)-> unless aOptionName in ['toc', 'heading', 'headingsAsToc'] throw new TypeError('invalid option name') if isArray aAlias aAlias.forEach (i)->gAliases[i] = aOptionName else if isString aAlias gAliases[aAlias] = aOptionName gAliases