parse_link_label.mjs 985 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. // Parse link label
  2. //
  3. // this function assumes that first character ("[") already matches;
  4. // returns the end of the label
  5. //
  6. export default function parseLinkLabel (state, start, disableNested) {
  7. let level, found, marker, prevPos
  8. const max = state.posMax
  9. const oldPos = state.pos
  10. state.pos = start + 1
  11. level = 1
  12. while (state.pos < max) {
  13. marker = state.src.charCodeAt(state.pos)
  14. if (marker === 0x5D /* ] */) {
  15. level--
  16. if (level === 0) {
  17. found = true
  18. break
  19. }
  20. }
  21. prevPos = state.pos
  22. state.md.inline.skipToken(state)
  23. if (marker === 0x5B /* [ */) {
  24. if (prevPos === state.pos - 1) {
  25. // increase level if we find text `[`, which is not a part of any token
  26. level++
  27. } else if (disableNested) {
  28. state.pos = oldPos
  29. return -1
  30. }
  31. }
  32. }
  33. let labelEnd = -1
  34. if (found) {
  35. labelEnd = state.pos
  36. }
  37. // restore old state
  38. state.pos = oldPos
  39. return labelEnd
  40. }