code.js 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. /**
  2. * @import {Element, Properties} from 'hast'
  3. * @import {Code} from 'mdast'
  4. * @import {State} from '../state.js'
  5. */
  6. /**
  7. * Turn an mdast `code` node into hast.
  8. *
  9. * @param {State} state
  10. * Info passed around.
  11. * @param {Code} node
  12. * mdast node.
  13. * @returns {Element}
  14. * hast node.
  15. */
  16. export function code(state, node) {
  17. const value = node.value ? node.value + '\n' : ''
  18. /** @type {Properties} */
  19. const properties = {}
  20. // Someone can write `js python	ruby`.
  21. const language = node.lang ? node.lang.split(/\s+/) : []
  22. // GH/CM still drop the non-first languages.
  23. if (language.length > 0) {
  24. properties.className = ['language-' + language[0]]
  25. }
  26. // Create `<code>`.
  27. /** @type {Element} */
  28. let result = {
  29. type: 'element',
  30. tagName: 'code',
  31. properties,
  32. children: [{type: 'text', value}]
  33. }
  34. if (node.meta) {
  35. result.data = {meta: node.meta}
  36. }
  37. state.patch(node, result)
  38. result = state.applyData(node, result)
  39. // Create `<pre>`.
  40. result = {type: 'element', tagName: 'pre', properties: {}, children: [result]}
  41. state.patch(node, result)
  42. return result
  43. }