header-line-number.js 1021 B

12345678910111213141516171819202122232425262728293031323334
  1. export default class HeaderLineNumberConfigurer {
  2. constructor() {
  3. this.firstLine = 0;
  4. }
  5. configure(md) {
  6. for (const renderName of ['paragraph_open', 'heading_open', 'image', 'code_block', 'blockquote_open', 'list_item_open']) {
  7. this.addLineNumberRenderer(md, renderName);
  8. }
  9. }
  10. /**
  11. * Add line numbers for sync scroll
  12. * @see https://github.com/Microsoft/vscode/blob/6e8d4d057bd1152d49a1e9780ec6db6363593855/extensions/markdown/src/markdownEngine.ts#L118
  13. */
  14. addLineNumberRenderer(md, ruleName) {
  15. const original = md.renderer.rules[ruleName];
  16. md.renderer.rules[ruleName] = (tokens, idx, options, env, self) => {
  17. const token = tokens[idx];
  18. if (token.map && token.map.length) {
  19. token.attrSet('data-line', this.firstLine + token.map[0]);
  20. token.attrJoin('class', 'code-line');
  21. }
  22. if (original) {
  23. return original(tokens, idx, options, env, self);
  24. }
  25. return self.renderToken(tokens, idx, options, env, self);
  26. };
  27. }
  28. }