59 lines
2.2 KiB
JavaScript
59 lines
2.2 KiB
JavaScript
"use strict";
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
exports.sweep = exports.default = void 0;
|
|
var _plugin = _interopRequireDefault(require("../plugin"));
|
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
/** @module */
|
|
|
|
/**
|
|
* Marpit sweep plugin.
|
|
*
|
|
* Hide blank paragraphs. For better support of the background image syntax and
|
|
* directives through HTML comment, Marpit will sweep paragraphs included only
|
|
* whitespace by setting `hidden: true`.
|
|
*
|
|
* It also sweep the inline token marked as hidden forcely. Please notice that
|
|
* plugins executed after this cannot handle hidden inline tokens.
|
|
*
|
|
* @function sweep
|
|
* @param {MarkdownIt} md markdown-it instance.
|
|
*/
|
|
function _sweep(md) {
|
|
md.core.ruler.after('inline', 'marpit_sweep', state => {
|
|
if (state.inlineMode) return;
|
|
for (const token of state.tokens) {
|
|
if (token.type === 'html_block' && token.content.match(/^\s*$/) || token.type === 'inline' && token.children.filter(t => !(t.hidden || t.type === 'softbreak')).every(t => t.type === 'text' && t.content.match(/^\s*$/))) token.hidden = true;
|
|
}
|
|
});
|
|
md.core.ruler.push('marpit_sweep_paragraph', state => {
|
|
if (state.inlineMode) return;
|
|
const current = {
|
|
open: [],
|
|
tokens: {}
|
|
};
|
|
for (const token of state.tokens) {
|
|
if (token.type === 'inline' && token.hidden) {
|
|
// markdown-it's "inline" type is not following a `hidden` flag. Marpit
|
|
// changes the token type to unique name to hide token forcely.
|
|
token.type = 'marpit_hidden_inline';
|
|
} else if (token.type === 'paragraph_open') {
|
|
current.open.push(token);
|
|
current.tokens[token] = [];
|
|
} else if (token.type === 'paragraph_close') {
|
|
const openToken = current.open.pop();
|
|
if (current.tokens[openToken].every(t => t.hidden)) {
|
|
openToken.hidden = true;
|
|
token.hidden = true;
|
|
}
|
|
} else {
|
|
const len = current.open.length;
|
|
if (len > 0) current.tokens[current.open[len - 1]].push(token);
|
|
}
|
|
}
|
|
});
|
|
}
|
|
const sweep = exports.sweep = (0, _plugin.default)(_sweep);
|
|
var _default = exports.default = sweep; |