Skip to content

Commit

Permalink
chore: add exclude pattern to the class appender (#378)
Browse files Browse the repository at this point in the history
  • Loading branch information
aircwo authored Sep 26, 2024
1 parent 41afa2c commit ee39caf
Show file tree
Hide file tree
Showing 3 changed files with 57 additions and 34 deletions.
45 changes: 33 additions & 12 deletions lib/_javascripts/markdownClassAppender.js
Original file line number Diff line number Diff line change
@@ -1,11 +1,22 @@
function appendRuleNames(md, tokens = [], appendRules = true) {
let ruleNames = Array.from(tokens);
function appendRuleNames(
md,
excludeTokens = [],
appendRules = true,
excludePatterns = [],
) {
let ruleNames = Array.from(excludeTokens);
if (appendRules) {
for (let ruleName in md.renderer.rules) {
if (!ruleNames.includes(ruleName)) {
ruleNames.push(ruleName);
}
}
Object.keys(md.renderer.rules)
.filter(
(ruleName) =>
!ruleNames.includes(ruleName) &&
!excludePatterns.some((pattern) =>
typeof pattern === 'string'
? ruleName.includes(pattern)
: pattern.test(ruleName),
),
)
.forEach((ruleName) => ruleNames.push(ruleName));
}
return ruleNames;
}
Expand All @@ -27,13 +38,23 @@ function decorate(md, ruleName, cssClass) {
};
}

module.exports = (md, tokens = [], appendRules = true, cssClass = 'md') => {
//use all tokens unless specified
let ruleNames = appendRuleNames(md, tokens, appendRules);
module.exports = (md, options = {}) => {
const {
excludeTokens = [],
appendRules = true,
cssClass = 'md',
excludePatterns = [],
} = options;

let ruleNames = appendRuleNames(
md,
excludeTokens,
appendRules,
excludePatterns,
);

console.log(`configuring CSS class appender for [${ruleNames}]`);
for (let i in ruleNames) {
let ruleName = ruleNames[i];
for (let ruleName of ruleNames) {
decorate(md, ruleName, cssClass);
}
};
20 changes: 4 additions & 16 deletions lib/_libraries/markdown.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,21 +10,6 @@ module.exports = (() => {
typographer: true,
});

// Remember the old renderer if overridden, or proxy to the default renderer.
let defaultRender =
md.renderer.rules.link_open ||
function (tokens, idx, options, env, self) {
return self.renderToken(tokens, idx, options);
};

md.renderer.rules.p = function (tokens, idx, options, env, self) {
// Adds a 'md' CSS class
tokens[idx].attrJoin('class', 'md');

// Pass the token to the default renderer.
return defaultRender(tokens, idx, options, env, self);
};

md.use(require('markdown-it-abbr'))
.use(require('markdown-it-attrs'))
.use(anchor, {
Expand Down Expand Up @@ -63,7 +48,10 @@ module.exports = (() => {
}
},
})
.use(require('../_javascripts/markdownClassAppender'), ['dl_open']);
.use(require('../_javascripts/markdownClassAppender'), {
excludeTokens: ['dl_open'],
excludePatterns: ['admonition'],
});

return md;
})();
26 changes: 20 additions & 6 deletions lib/tests/javascripts/markdownClassAppender.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,10 @@ const appender = require('../../_javascripts/markdownClassAppender');
const markdownit = require('markdown-it');

const fixture_h1 = '# heading 1';
const fixture_admonition = '!!! note\n This is an admonition.';

function md(tokens, appendRules) {
return markdownit().use(appender, tokens, appendRules);
function md(options = {}) {
return markdownit().use(appender, options);
}

describe('markdownClassAppender', () => {
Expand All @@ -19,14 +20,27 @@ describe('markdownClassAppender', () => {
});

test('should add class to configured tokens', () => {
expect(md(['heading_open']).render(fixture_h1)).toEqual(
expect(md({ excludeTokens: ['heading_open'] }).render(fixture_h1)).toEqual(
'<h1 class="md">heading 1</h1>\n',
);
});

test('should miss class when default rules excluded', () => {
expect(md([], false).render('`javascript`')).toEqual(
'<p><code>javascript</code></p>\n',
);
expect(
md({ excludeTokens: [], appendRules: false }).render('`javascript`'),
).toEqual('<p><code>javascript</code></p>\n');
});

test.each(['admonition', /^admonition/])(
'should exclude patterns specified as types of strings',
(excludePattern) => {
// given / when
const result = md({ excludePatterns: [excludePattern] }).render(
fixture_admonition,
);

// then
expect(result).not.toContain('md');
},
);
});

0 comments on commit ee39caf

Please sign in to comment.