Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.8/site-packages/markdown_it/rules_inline/image.py: 98%
88 statements
« prev ^ index » next coverage.py v7.2.7, created at 2023-06-07 06:15 +0000
« prev ^ index » next coverage.py v7.2.7, created at 2023-06-07 06:15 +0000
1# Process 
2from __future__ import annotations
4from ..common.utils import isStrSpace, normalizeReference
5from ..token import Token
6from .state_inline import StateInline
9def image(state: StateInline, silent: bool) -> bool:
10 label = None
11 href = ""
12 oldPos = state.pos
13 max = state.posMax
15 if state.src[state.pos] != "!":
16 return False
18 if state.pos + 1 < state.posMax and state.src[state.pos + 1] != "[":
19 return False
21 labelStart = state.pos + 2
22 labelEnd = state.md.helpers.parseLinkLabel(state, state.pos + 1, False)
24 # parser failed to find ']', so it's not a valid link
25 if labelEnd < 0:
26 return False
28 pos = labelEnd + 1
30 if pos < max and state.src[pos] == "(":
31 #
32 # Inline link
33 #
35 # [link]( <href> "title" )
36 # ^^ skipping these spaces
37 pos += 1
38 while pos < max:
39 ch = state.src[pos]
40 if not isStrSpace(ch) and ch != "\n":
41 break
42 pos += 1
44 if pos >= max:
45 return False
47 # [link]( <href> "title" )
48 # ^^^^^^ parsing link destination
49 start = pos
50 res = state.md.helpers.parseLinkDestination(state.src, pos, state.posMax)
51 if res.ok:
52 href = state.md.normalizeLink(res.str)
53 if state.md.validateLink(href):
54 pos = res.pos
55 else:
56 href = ""
58 # [link]( <href> "title" )
59 # ^^ skipping these spaces
60 start = pos
61 while pos < max:
62 ch = state.src[pos]
63 if not isStrSpace(ch) and ch != "\n":
64 break
65 pos += 1
67 # [link]( <href> "title" )
68 # ^^^^^^^ parsing link title
69 res = state.md.helpers.parseLinkTitle(state.src, pos, state.posMax)
70 if pos < max and start != pos and res.ok:
71 title = res.str
72 pos = res.pos
74 # [link]( <href> "title" )
75 # ^^ skipping these spaces
76 while pos < max:
77 ch = state.src[pos]
78 if not isStrSpace(ch) and ch != "\n":
79 break
80 pos += 1
81 else:
82 title = ""
84 if pos >= max or state.src[pos] != ")":
85 state.pos = oldPos
86 return False
88 pos += 1
90 else:
91 #
92 # Link reference
93 #
94 if "references" not in state.env:
95 return False
97 # /* [ */
98 if pos < max and state.src[pos] == "[":
99 start = pos + 1
100 pos = state.md.helpers.parseLinkLabel(state, pos)
101 if pos >= 0:
102 label = state.src[start:pos]
103 pos += 1
104 else:
105 pos = labelEnd + 1
106 else:
107 pos = labelEnd + 1
109 # covers label == '' and label == undefined
110 # (collapsed reference link and shortcut reference link respectively)
111 if not label:
112 label = state.src[labelStart:labelEnd]
114 label = normalizeReference(label)
116 ref = state.env["references"].get(label, None)
117 if not ref:
118 state.pos = oldPos
119 return False
121 href = ref["href"]
122 title = ref["title"]
124 #
125 # We found the end of the link, and know for a fact it's a valid link
126 # so all that's left to do is to call tokenizer.
127 #
128 if not silent:
129 content = state.src[labelStart:labelEnd]
131 tokens: list[Token] = []
132 state.md.inline.parse(content, state.md, state.env, tokens)
134 token = state.push("image", "img", 0)
135 token.attrs = {"src": href, "alt": ""}
136 token.children = tokens or None
137 token.content = content
139 if title:
140 token.attrSet("title", title)
142 # note, this is not part of markdown-it JS, but is useful for renderers
143 if label and state.md.options.get("store_labels", False):
144 token.meta["label"] = label
146 state.pos = pos
147 state.posMax = max
148 return True