header-line-number.js 1.0 KB

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