123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120 |
- var definition = {
- name: 'definition',
- tokenize: tokenizeDefinition
- }
- export default definition
-
- import assert from 'assert'
- import codes from '../character/codes.mjs'
- import markdownLineEnding from '../character/markdown-line-ending.mjs'
- import markdownLineEndingOrSpace from '../character/markdown-line-ending-or-space.mjs'
- import types from '../constant/types.mjs'
- import normalizeIdentifier from '../util/normalize-identifier.mjs'
- import destinationFactory from './factory-destination.mjs'
- import labelFactory from './factory-label.mjs'
- import spaceFactory from './factory-space.mjs'
- import whitespaceFactory from './factory-whitespace.mjs'
- import titleFactory from './factory-title.mjs'
-
- var titleConstruct = {tokenize: tokenizeTitle, partial: true}
-
- function tokenizeDefinition(effects, ok, nok) {
- var self = this
- var identifier
-
- return start
-
- function start(code) {
- assert(code === codes.leftSquareBracket, 'expected `[`')
- effects.enter(types.definition)
- return labelFactory.call(
- self,
- effects,
- labelAfter,
- nok,
- types.definitionLabel,
- types.definitionLabelMarker,
- types.definitionLabelString
- )(code)
- }
-
- function labelAfter(code) {
- identifier = normalizeIdentifier(
- self.sliceSerialize(self.events[self.events.length - 1][1]).slice(1, -1)
- )
-
- if (code === codes.colon) {
- effects.enter(types.definitionMarker)
- effects.consume(code)
- effects.exit(types.definitionMarker)
-
- // Note: blank lines can’t exist in content.
- return whitespaceFactory(
- effects,
- destinationFactory(
- effects,
- effects.attempt(
- titleConstruct,
- spaceFactory(effects, after, types.whitespace),
- spaceFactory(effects, after, types.whitespace)
- ),
- nok,
- types.definitionDestination,
- types.definitionDestinationLiteral,
- types.definitionDestinationLiteralMarker,
- types.definitionDestinationRaw,
- types.definitionDestinationString
- )
- )
- }
-
- return nok(code)
- }
-
- function after(code) {
- if (code === codes.eof || markdownLineEnding(code)) {
- effects.exit(types.definition)
-
- if (self.parser.defined.indexOf(identifier) < 0) {
- self.parser.defined.push(identifier)
- }
-
- return ok(code)
- }
-
- return nok(code)
- }
- }
-
- function tokenizeTitle(effects, ok, nok) {
- return start
-
- function start(code) {
- return markdownLineEndingOrSpace(code)
- ? whitespaceFactory(effects, before)(code)
- : nok(code)
- }
-
- function before(code) {
- if (
- code === codes.quotationMark ||
- code === codes.apostrophe ||
- code === codes.leftParenthesis
- ) {
- return titleFactory(
- effects,
- spaceFactory(effects, after, types.whitespace),
- nok,
- types.definitionTitle,
- types.definitionTitleMarker,
- types.definitionTitleString
- )(code)
- }
-
- return nok(code)
- }
-
- function after(code) {
- return code === codes.eof || markdownLineEnding(code) ? ok(code) : nok(code)
- }
- }
|