|
|
'use strict'
|
|
|
|
|
|
var repeat = require('repeat-string')
|
|
|
var pad = require('../util/pad')
|
|
|
|
|
|
module.exports = listItem
|
|
|
|
|
|
var lineFeed = '\n'
|
|
|
var space = ' '
|
|
|
var leftSquareBracket = '['
|
|
|
var rightSquareBracket = ']'
|
|
|
var lowercaseX = 'x'
|
|
|
|
|
|
var ceil = Math.ceil
|
|
|
var blank = lineFeed + lineFeed
|
|
|
|
|
|
var tabSize = 4
|
|
|
|
|
|
// Stringify a list item.
|
|
|
//
|
|
|
// Prefixes the content with a checked checkbox when `checked: true`:
|
|
|
//
|
|
|
// ```markdown
|
|
|
// [x] foo
|
|
|
// ```
|
|
|
//
|
|
|
// Prefixes the content with an unchecked checkbox when `checked: false`:
|
|
|
//
|
|
|
// ```markdown
|
|
|
// [ ] foo
|
|
|
// ```
|
|
|
function listItem(node, parent, position, bullet) {
|
|
|
var self = this
|
|
|
var style = self.options.listItemIndent
|
|
|
var marker = bullet || self.options.bullet
|
|
|
var spread = node.spread == null ? true : node.spread
|
|
|
var checked = node.checked
|
|
|
var children = node.children
|
|
|
var length = children.length
|
|
|
var values = []
|
|
|
var index = -1
|
|
|
var value
|
|
|
var indent
|
|
|
var spacing
|
|
|
|
|
|
while (++index < length) {
|
|
|
values[index] = self.visit(children[index], node)
|
|
|
}
|
|
|
|
|
|
value = values.join(spread ? blank : lineFeed)
|
|
|
|
|
|
if (typeof checked === 'boolean') {
|
|
|
// Note: I’d like to be able to only add the space between the check and
|
|
|
// the value, but unfortunately github does not support empty list-items
|
|
|
// with a checkbox :(
|
|
|
value =
|
|
|
leftSquareBracket +
|
|
|
(checked ? lowercaseX : space) +
|
|
|
rightSquareBracket +
|
|
|
space +
|
|
|
value
|
|
|
}
|
|
|
|
|
|
if (style === '1' || (style === 'mixed' && value.indexOf(lineFeed) === -1)) {
|
|
|
indent = marker.length + 1
|
|
|
spacing = space
|
|
|
} else {
|
|
|
indent = ceil((marker.length + 1) / tabSize) * tabSize
|
|
|
spacing = repeat(space, indent - marker.length)
|
|
|
}
|
|
|
|
|
|
return value
|
|
|
? marker + spacing + pad(value, indent / tabSize).slice(indent)
|
|
|
: marker
|
|
|
}
|