Skip to content

Commit f99ab86

Browse files
committed
🧹 refactor(parser): reduce inline handler complexity
1 parent 7c9ad59 commit f99ab86

1 file changed

Lines changed: 75 additions & 40 deletions

File tree

‎sdiff/parser.py‎

Lines changed: 75 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -164,53 +164,88 @@ def flush_buffer():
164164
self._split_reference_links(buffer, nodes)
165165
buffer = ''
166166

167+
handlers = {
168+
'text': self._handle_inline_text,
169+
'inline_html': self._handle_inline_text,
170+
'block_html': self._handle_inline_text,
171+
'codespan': self._handle_inline_codespan,
172+
'softbreak': self._handle_inline_softbreak,
173+
'linebreak': self._handle_inline_linebreak,
174+
'link': self._handle_inline_link,
175+
'image': self._handle_inline_image,
176+
'strong': self._handle_inline_marker,
177+
'emphasis': self._handle_inline_marker,
178+
'strikethrough': self._handle_inline_marker,
179+
}
180+
167181
for token in tokens:
168182
token_type = token.get('type')
169-
if token_type in {'text', 'inline_html', 'block_html'}:
170-
raw = token.get('raw', '')
171-
buffer += self._reference_definitions.get(raw, raw)
172-
elif token_type == 'codespan':
173-
buffer += f"`{token.get('raw') or token.get('text') or ''}`"
174-
elif token_type == 'softbreak':
175-
buffer += ' '
176-
elif token_type == 'linebreak':
177-
flush_buffer()
178-
nodes.append(NewLine())
179-
elif token_type == 'link':
180-
flush_buffer()
181-
text = self._flatten_inline_text(token.get('children', []))
182-
attrs = token.get('attrs', {})
183-
url = attrs.get('url', '')
184-
title = attrs.get('title')
185-
nodes.append(Link(_format_link_markup(text, url, title)))
186-
elif token_type == 'image':
187-
flush_buffer()
188-
alt = token.get('attrs', {}).get('alt') or self._flatten_inline_text(token.get('children', []))
189-
attrs = token.get('attrs', {})
190-
url = attrs.get('url', '')
191-
title = attrs.get('title')
192-
nodes.append(Image(_format_image_markup(alt, url, title)))
193-
elif token_type in _INLINE_MARKERS:
194-
flush_buffer()
195-
marker = _INLINE_MARKERS[token_type]
196-
_append_text(nodes, marker)
197-
children = token.get('children', [])
198-
if children:
199-
nodes.extend(self._convert_inline_tokens(children))
200-
_append_text(nodes, marker)
183+
handler = handlers.get(token_type)
184+
if handler:
185+
buffer = handler(token, nodes, buffer, flush_buffer)
201186
else:
202-
flush_buffer()
203-
children = token.get('children', [])
204-
if children:
205-
nodes.extend(self._convert_inline_tokens(children))
206-
else:
207-
raw = token.get('raw') or token.get('text') or ''
208-
if raw.strip():
209-
_append_text(nodes, mistune.escape(raw))
187+
buffer = self._handle_inline_other(token, nodes, buffer, flush_buffer)
210188

211189
flush_buffer()
212190
return nodes
213191

192+
def _handle_inline_text(self, token, nodes, buffer, flush_buffer):
193+
raw = token.get('raw', '')
194+
buffer += self._reference_definitions.get(raw, raw)
195+
return buffer
196+
197+
def _handle_inline_codespan(self, token, nodes, buffer, flush_buffer):
198+
buffer += f"`{token.get('raw') or token.get('text') or ''}`"
199+
return buffer
200+
201+
def _handle_inline_softbreak(self, token, nodes, buffer, flush_buffer):
202+
buffer += ' '
203+
return buffer
204+
205+
def _handle_inline_linebreak(self, token, nodes, buffer, flush_buffer):
206+
flush_buffer()
207+
nodes.append(NewLine())
208+
return buffer
209+
210+
def _handle_inline_link(self, token, nodes, buffer, flush_buffer):
211+
flush_buffer()
212+
text = self._flatten_inline_text(token.get('children', []))
213+
attrs = token.get('attrs', {})
214+
url = attrs.get('url', '')
215+
title = attrs.get('title')
216+
nodes.append(Link(_format_link_markup(text, url, title)))
217+
return buffer
218+
219+
def _handle_inline_image(self, token, nodes, buffer, flush_buffer):
220+
flush_buffer()
221+
alt = token.get('attrs', {}).get('alt') or self._flatten_inline_text(token.get('children', []))
222+
attrs = token.get('attrs', {})
223+
url = attrs.get('url', '')
224+
title = attrs.get('title')
225+
nodes.append(Image(_format_image_markup(alt, url, title)))
226+
return buffer
227+
228+
def _handle_inline_marker(self, token, nodes, buffer, flush_buffer):
229+
flush_buffer()
230+
marker = _INLINE_MARKERS[token.get('type')]
231+
_append_text(nodes, marker)
232+
children = token.get('children', [])
233+
if children:
234+
nodes.extend(self._convert_inline_tokens(children))
235+
_append_text(nodes, marker)
236+
return buffer
237+
238+
def _handle_inline_other(self, token, nodes, buffer, flush_buffer):
239+
flush_buffer()
240+
children = token.get('children', [])
241+
if children:
242+
nodes.extend(self._convert_inline_tokens(children))
243+
else:
244+
raw = token.get('raw') or token.get('text') or ''
245+
if raw.strip():
246+
_append_text(nodes, mistune.escape(raw))
247+
return buffer
248+
214249
def _flatten_inline_text(self, tokens: Iterable[dict]):
215250
parts = []
216251
for token in tokens:

0 commit comments

Comments
 (0)