"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = exports.apply = void 0;
var _lodash = _interopRequireDefault(require("lodash.kebabcase"));
var _inline_style = _interopRequireDefault(require("../../helpers/inline_style"));
var _plugin = _interopRequireDefault(require("../../plugin"));
var _directives = _interopRequireDefault(require("./directives"));
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/** @module */

/**
 * Apply parsed Marpit directives to markdown-it tokens.
 *
 * @function apply
 * @param {MarkdownIt} md markdown-it instance.
 * @param {Object} [opts]
 * @param {boolean} [opts.dataset=true] Assigns directives as HTML data
 *     attributes of each section tag.
 * @param {boolean} [opts.css=true] Assigns directives as CSS Custom Properties
 *     of each section tag.
 */
function _apply(md, opts = {}) {
  const {
    marpit
  } = md;
  const {
    lang
  } = marpit.options;
  const dataset = opts.dataset === undefined ? true : !!opts.dataset;
  const css = opts.css === undefined ? true : !!opts.css;
  const {
    global,
    local
  } = marpit.customDirectives;
  const directives = [...Object.keys(global), ...Object.keys(local), ..._directives.default];
  md.core.ruler.after('marpit_directives_parse', 'marpit_directives_apply', state => {
    if (state.inlineMode) return;
    let pageNumber = 0;
    const tokensForPaginationTotal = [];
    for (const token of state.tokens) {
      const {
        marpitDirectives
      } = token.meta || {};
      if (token.type === 'marpit_slide_open') {
        // `skip` and `hold` disable increment of the page number
        if (!(marpitDirectives?.paginate === 'skip' || marpitDirectives?.paginate === 'hold')) {
          pageNumber += 1;
        }
      }
      if (marpitDirectives) {
        const style = new _inline_style.default(token.attrGet('style'));
        for (const dir of Object.keys(marpitDirectives)) {
          if (directives.includes(dir)) {
            const value = marpitDirectives[dir];
            if (value) {
              const kebabCaseDir = (0, _lodash.default)(dir);
              if (dataset) token.attrSet(`data-${kebabCaseDir}`, value);
              if (css) style.set(`--${kebabCaseDir}`, value);
            }
          }
        }

        // Apply attribute to token
        if (marpitDirectives.lang || lang) token.attrSet('lang', marpitDirectives.lang || lang);
        if (marpitDirectives.class) token.attrJoin('class', marpitDirectives.class);
        if (marpitDirectives.color) style.set('color', marpitDirectives.color);
        if (marpitDirectives.backgroundColor) style.set('background-color', marpitDirectives.backgroundColor).set('background-image', 'none');
        if (marpitDirectives.backgroundImage) {
          style.set('background-image', marpitDirectives.backgroundImage).set('background-position', 'center').set('background-repeat', 'no-repeat').set('background-size', 'cover');
          if (marpitDirectives.backgroundPosition) style.set('background-position', marpitDirectives.backgroundPosition);
          if (marpitDirectives.backgroundRepeat) style.set('background-repeat', marpitDirectives.backgroundRepeat);
          if (marpitDirectives.backgroundSize) style.set('background-size', marpitDirectives.backgroundSize);
        }
        if (marpitDirectives.paginate && marpitDirectives.paginate !== 'skip') {
          // If the page number was still not incremented, mark this page as
          // the first page.
          if (pageNumber <= 0) pageNumber = 1;
          token.attrSet('data-marpit-pagination', pageNumber);
          tokensForPaginationTotal.push(token);
        }
        if (marpitDirectives.header) token.meta.marpitHeader = marpitDirectives.header;
        if (marpitDirectives.footer) token.meta.marpitFooter = marpitDirectives.footer;
        const styleStr = style.toString();
        if (styleStr !== '') token.attrSet('style', styleStr);
      }
    }

    // Set total page number to each slide page that has pagination attribute
    for (const token of tokensForPaginationTotal) {
      token.attrSet('data-marpit-pagination-total', pageNumber);
    }
  });
}
const apply = exports.apply = (0, _plugin.default)(_apply);
var _default = exports.default = apply;