export function setup(helper) { const opts = helper.getOptions(); if (opts.previewing && opts.injectLineNumbersToPreview) { helper.whiteList([ "p.preview-sync-line", "p[data-line-number]", "h1.preview-sync-line", "h1[data-line-number]", "h2.preview-sync-line", "h2[data-line-number]", "h3.preview-sync-line", "h3[data-line-number]", "h4.preview-sync-line", "h4[data-line-number]", "h5.preview-sync-line", "h5[data-line-number]", "h6.preview-sync-line", "h6[data-line-number]", "blockquote.preview-sync-line", "blockquote[data-line-number]", "hr.preview-sync-line", "hr[data-line-number]", "ul.preview-sync-line", "ul[data-line-number]", "ol.preview-sync-line", "ol[data-line-number]" ]); helper.registerPlugin(md => { const injectLineNumber = (tokens, index, options, env, self) => { let line; const token = tokens[index]; if (token.map && token.level === 0) { line = token.map[0]; token.attrJoin("class", "preview-sync-line"); token.attrSet("data-line-number", String(line)); } return self.renderToken(tokens, index, options, env, self); }; md.renderer.rules.paragraph_open = injectLineNumber; md.renderer.rules.heading_open = injectLineNumber; md.renderer.rules.blockquote_open = injectLineNumber; md.renderer.rules.hr = injectLineNumber; md.renderer.rules.ordered_list_open = injectLineNumber; md.renderer.rules.bullet_list_open = injectLineNumber; }); } }