header-line-number.js 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. export default class HeaderLineNumberConfigurer {
  2. constructor(crowi) {
  3. this.crowi = crowi;
  4. this.injectLineNumbers = this.injectLineNumbers.bind(this);
  5. this.combineRules = this.combineRules.bind(this);
  6. }
  7. configure(md) {
  8. const rules = md.renderer.rules;
  9. const headingOpenOrg = rules.heading_open;
  10. const paragraphOpenOrg = rules.paragraph_open;
  11. // combine rule and set
  12. rules.heading_open = this.combineRules(this.injectLineNumbers, headingOpenOrg);
  13. rules.paragraph_open = this.combineRules(this.injectLineNumbers, paragraphOpenOrg);
  14. }
  15. /**
  16. * Inject line numbers for sync scroll
  17. * @see https://github.com/markdown-it/markdown-it/blob/e6f19eab4204122e85e4a342e0c1c8486ff40c2d/support/demo_template/index.js#L169
  18. */
  19. injectLineNumbers(tokens, idx, options, env, slf) {
  20. var line;
  21. if (tokens[idx].map && tokens[idx].level === 0) {
  22. line = tokens[idx].map[0] + 1; // add 1 to convert to line number
  23. tokens[idx].attrJoin('class', 'line');
  24. tokens[idx].attrSet('data-line', String(line));
  25. }
  26. return slf.renderToken(tokens, idx, options, env, slf);
  27. }
  28. combineRules(rule1, rule2) {
  29. return (tokens, idx, options, env, slf) => {
  30. if (rule1 != null) {
  31. rule1(tokens, idx, options, env, slf);
  32. }
  33. if (rule2 != null) {
  34. rule2(tokens, idx, options, env, slf);
  35. }
  36. return slf.renderToken(tokens, idx, options, env, slf);
  37. }
  38. }
  39. }