|
- const {
- TOKEN_OPEN_TAG_END,
- TOKEN_OPEN_TAG_END_SCRIPT,
- TOKEN_OPEN_TAG_END_STYLE,
- TOKEN_ATTRIBUTE_KEY,
- TOKEN_ATTRIBUTE_ASSIGNMENT
- } = require('../constants/token-types')
- const {
- ATTRIBUTE_VALUE_CONTEXT
- } = require('../constants/tree-constructor-contexts')
-
- function getLastAttribute (state) {
- const attributes = state.currentNode.content.attributes
-
- return attributes[attributes.length - 1]
- }
-
- function handleOpenTagEnd (state) {
- state.currentContext = state.currentContext.parentRef
-
- return state
- }
-
- function handleAttributeKey (state, token) {
- const attribute = getLastAttribute(state)
-
- if (attribute.key !== undefined || attribute.value !== undefined) {
- state.currentContext = state.currentContext.parentRef
-
- return state
- }
-
- attribute.key = token
- state.caretPosition++
-
- return state
- }
-
- function handleAttributeAssignment (state) {
- const attribute = getLastAttribute(state)
-
- if (attribute.value !== undefined) {
- state.currentContext = state.currentContext.parentRef
-
- return state
- }
-
- state.currentContext = {
- parentRef: state.currentContext,
- type: ATTRIBUTE_VALUE_CONTEXT
- }
- state.caretPosition++
-
- return state
- }
-
- module.exports = function attribute (token, state) {
- const OPEN_TAG_END_TOKENS = [
- TOKEN_OPEN_TAG_END,
- TOKEN_OPEN_TAG_END_SCRIPT,
- TOKEN_OPEN_TAG_END_STYLE
- ]
-
- if (OPEN_TAG_END_TOKENS.indexOf(token.type) !== -1) {
- return handleOpenTagEnd(state)
- }
-
- if (token.type === TOKEN_ATTRIBUTE_KEY) {
- return handleAttributeKey(state, token)
- }
-
- if (token.type === TOKEN_ATTRIBUTE_ASSIGNMENT) {
- return handleAttributeAssignment(state)
- }
-
- state.caretPosition++
-
- return state
- }
|