123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 |
- 'use strict'
-
- var markdownLineEnding = require('../character/markdown-line-ending.js')
- var markdownLineEndingOrSpace = require('../character/markdown-line-ending-or-space.js')
- var normalizeIdentifier = require('../util/normalize-identifier.js')
- var factoryDestination = require('./factory-destination.js')
- var factoryLabel = require('./factory-label.js')
- var factorySpace = require('./factory-space.js')
- var factoryWhitespace = require('./factory-whitespace.js')
- var factoryTitle = require('./factory-title.js')
-
- var definition = {
- name: 'definition',
- tokenize: tokenizeDefinition
- }
- var titleConstruct = {
- tokenize: tokenizeTitle,
- partial: true
- }
-
- function tokenizeDefinition(effects, ok, nok) {
- var self = this
- var identifier
- return start
-
- function start(code) {
- effects.enter('definition')
- return factoryLabel.call(
- self,
- effects,
- labelAfter,
- nok,
- 'definitionLabel',
- 'definitionLabelMarker',
- 'definitionLabelString'
- )(code)
- }
-
- function labelAfter(code) {
- identifier = normalizeIdentifier(
- self.sliceSerialize(self.events[self.events.length - 1][1]).slice(1, -1)
- )
-
- if (code === 58) {
- effects.enter('definitionMarker')
- effects.consume(code)
- effects.exit('definitionMarker') // Note: blank lines can’t exist in content.
-
- return factoryWhitespace(
- effects,
- factoryDestination(
- effects,
- effects.attempt(
- titleConstruct,
- factorySpace(effects, after, 'whitespace'),
- factorySpace(effects, after, 'whitespace')
- ),
- nok,
- 'definitionDestination',
- 'definitionDestinationLiteral',
- 'definitionDestinationLiteralMarker',
- 'definitionDestinationRaw',
- 'definitionDestinationString'
- )
- )
- }
-
- return nok(code)
- }
-
- function after(code) {
- if (code === null || markdownLineEnding(code)) {
- effects.exit('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)
- ? factoryWhitespace(effects, before)(code)
- : nok(code)
- }
-
- function before(code) {
- if (code === 34 || code === 39 || code === 40) {
- return factoryTitle(
- effects,
- factorySpace(effects, after, 'whitespace'),
- nok,
- 'definitionTitle',
- 'definitionTitleMarker',
- 'definitionTitleString'
- )(code)
- }
-
- return nok(code)
- }
-
- function after(code) {
- return code === null || markdownLineEnding(code) ? ok(code) : nok(code)
- }
- }
-
- module.exports = definition
|