123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 |
- 'use strict'
-
- var assert = require('assert')
- var decodeEntity = require('parse-entities/decode-entity.js')
- var asciiAlphanumeric = require('../character/ascii-alphanumeric.js')
- var asciiDigit = require('../character/ascii-digit.js')
- var asciiHexDigit = require('../character/ascii-hex-digit.js')
- var codes = require('../character/codes.js')
- var constants = require('../constant/constants.js')
- var types = require('../constant/types.js')
-
- function _interopDefaultLegacy(e) {
- return e && typeof e === 'object' && 'default' in e ? e : {default: e}
- }
-
- var assert__default = /*#__PURE__*/ _interopDefaultLegacy(assert)
- var decodeEntity__default = /*#__PURE__*/ _interopDefaultLegacy(decodeEntity)
-
- var characterReference = {
- name: 'characterReference',
- tokenize: tokenizeCharacterReference
- }
-
- function tokenizeCharacterReference(effects, ok, nok) {
- var self = this
- var size = 0
- var max
- var test
-
- return start
-
- function start(code) {
- assert__default['default'](code === codes.ampersand, 'expected `&`')
- effects.enter(types.characterReference)
- effects.enter(types.characterReferenceMarker)
- effects.consume(code)
- effects.exit(types.characterReferenceMarker)
- return open
- }
-
- function open(code) {
- if (code === codes.numberSign) {
- effects.enter(types.characterReferenceMarkerNumeric)
- effects.consume(code)
- effects.exit(types.characterReferenceMarkerNumeric)
- return numeric
- }
-
- effects.enter(types.characterReferenceValue)
- max = constants.characterReferenceNamedSizeMax
- test = asciiAlphanumeric
- return value(code)
- }
-
- function numeric(code) {
- if (code === codes.uppercaseX || code === codes.lowercaseX) {
- effects.enter(types.characterReferenceMarkerHexadecimal)
- effects.consume(code)
- effects.exit(types.characterReferenceMarkerHexadecimal)
- effects.enter(types.characterReferenceValue)
- max = constants.characterReferenceHexadecimalSizeMax
- test = asciiHexDigit
- return value
- }
-
- effects.enter(types.characterReferenceValue)
- max = constants.characterReferenceDecimalSizeMax
- test = asciiDigit
- return value(code)
- }
-
- function value(code) {
- var token
-
- if (code === codes.semicolon && size) {
- token = effects.exit(types.characterReferenceValue)
-
- if (
- test === asciiAlphanumeric &&
- !decodeEntity__default['default'](self.sliceSerialize(token))
- ) {
- return nok(code)
- }
-
- effects.enter(types.characterReferenceMarker)
- effects.consume(code)
- effects.exit(types.characterReferenceMarker)
- effects.exit(types.characterReference)
- return ok
- }
-
- if (test(code) && size++ < max) {
- effects.consume(code)
- return value
- }
-
- return nok(code)
- }
- }
-
- module.exports = characterReference
|