|
|
|
// Token class
|
|
|
|
|
|
|
|
/**
|
|
|
|
* class Token
|
|
|
|
**/
|
|
|
|
|
|
|
|
/**
|
|
|
|
* new Token(type, tag, nesting)
|
|
|
|
*
|
|
|
|
* Create new token and fill passed properties.
|
|
|
|
**/
|
|
|
|
function Token (type, tag, nesting) {
|
|
|
|
/**
|
|
|
|
* Token#type -> String
|
|
|
|
*
|
|
|
|
* Type of the token (string, e.g. "paragraph_open")
|
|
|
|
**/
|
|
|
|
this.type = type
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Token#tag -> String
|
|
|
|
*
|
|
|
|
* html tag name, e.g. "p"
|
|
|
|
**/
|
|
|
|
this.tag = tag
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Token#attrs -> Array
|
|
|
|
*
|
|
|
|
* Html attributes. Format: `[ [ name1, value1 ], [ name2, value2 ] ]`
|
|
|
|
**/
|
|
|
|
this.attrs = null
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Token#map -> Array
|
|
|
|
*
|
|
|
|
* Source map info. Format: `[ line_begin, line_end ]`
|
|
|
|
**/
|
|
|
|
this.map = null
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Token#nesting -> Number
|
|
|
|
*
|
|
|
|
* Level change (number in {-1, 0, 1} set), where:
|
|
|
|
*
|
|
|
|
* - `1` means the tag is opening
|
|
|
|
* - `0` means the tag is self-closing
|
|
|
|
* - `-1` means the tag is closing
|
|
|
|
**/
|
|
|
|
this.nesting = nesting
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Token#level -> Number
|
|
|
|
*
|
|
|
|
* nesting level, the same as `state.level`
|
|
|
|
**/
|
|
|
|
this.level = 0
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Token#children -> Array
|
|
|
|
*
|
|
|
|
* An array of child nodes (inline and img tokens)
|
|
|
|
**/
|
|
|
|
this.children = null
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Token#content -> String
|
|
|
|
*
|
|
|
|
* In a case of self-closing tag (code, html, fence, etc.),
|
|
|
|
* it has contents of this tag.
|
|
|
|
**/
|
|
|
|
this.content = ''
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Token#markup -> String
|
|
|
|
*
|
|
|
|
* '*' or '_' for emphasis, fence string for fence, etc.
|
|
|
|
**/
|
|
|
|
this.markup = ''
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Token#info -> String
|
|
|
|
*
|
|
|
|
* Additional information:
|
|
|
|
*
|
|
|
|
* - Info string for "fence" tokens
|
|
|
|
* - The value "auto" for autolink "link_open" and "link_close" tokens
|
|
|
|
* - The string value of the item marker for ordered-list "list_item_open" tokens
|
|
|
|
**/
|
|
|
|
this.info = ''
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Token#meta -> Object
|
|
|
|
*
|
|
|
|
* A place for plugins to store an arbitrary data
|
|
|
|
**/
|
|
|
|
this.meta = null
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Token#block -> Boolean
|
|
|
|
*
|
|
|
|
* True for block-level tokens, false for inline tokens.
|
|
|
|
* Used in renderer to calculate line breaks
|
|
|
|
**/
|
|
|
|
this.block = false
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Token#hidden -> Boolean
|
|
|
|
*
|
|
|
|
* If it's true, ignore this element when rendering. Used for tight lists
|
|
|
|
* to hide paragraphs.
|
|
|
|
**/
|
|
|
|
this.hidden = false
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Token.attrIndex(name) -> Number
|
|
|
|
*
|
|
|
|
* Search attribute index by name.
|
|
|
|
**/
|
|
|
|
Token.prototype.attrIndex = function attrIndex (name) {
|
|
|
|
if (!this.attrs) { return -1 }
|
|
|
|
|
|
|
|
const attrs = this.attrs
|
|
|
|
|
|
|
|
for (let i = 0, len = attrs.length; i < len; i++) {
|
|
|
|
if (attrs[i][0] === name) { return i }
|
|
|
|
}
|
|
|
|
return -1
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Token.attrPush(attrData)
|
|
|
|
*
|
|
|
|
* Add `[ name, value ]` attribute to list. Init attrs if necessary
|
|
|
|
**/
|
|
|
|
Token.prototype.attrPush = function attrPush (attrData) {
|
|
|
|
if (this.attrs) {
|
|
|
|
this.attrs.push(attrData)
|
|
|
|
} else {
|
|
|
|
this.attrs = [attrData]
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Token.attrSet(name, value)
|
|
|
|
*
|
|
|
|
* Set `name` attribute to `value`. Override old value if exists.
|
|
|
|
**/
|
|
|
|
Token.prototype.attrSet = function attrSet (name, value) {
|
|
|
|
const idx = this.attrIndex(name)
|
|
|
|
const attrData = [name, value]
|
|
|
|
|
|
|
|
if (idx < 0) {
|
|
|
|
this.attrPush(attrData)
|
|
|
|
} else {
|
|
|
|
this.attrs[idx] = attrData
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Token.attrGet(name)
|
|
|
|
*
|
|
|
|
* Get the value of attribute `name`, or null if it does not exist.
|
|
|
|
**/
|
|
|
|
Token.prototype.attrGet = function attrGet (name) {
|
|
|
|
const idx = this.attrIndex(name)
|
|
|
|
let value = null
|
|
|
|
if (idx >= 0) {
|
|
|
|
value = this.attrs[idx][1]
|
|
|
|
}
|
|
|
|
return value
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Token.attrJoin(name, value)
|
|
|
|
*
|
|
|
|
* Join value to existing attribute via space. Or create new attribute if not
|
|
|
|
* exists. Useful to operate with token classes.
|
|
|
|
**/
|
|
|
|
Token.prototype.attrJoin = function attrJoin (name, value) {
|
|
|
|
const idx = this.attrIndex(name)
|
|
|
|
|
|
|
|
if (idx < 0) {
|
|
|
|
this.attrPush([name, value])
|
|
|
|
} else {
|
|
|
|
this.attrs[idx][1] = this.attrs[idx][1] + ' ' + value
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
export default Token
|