@@ -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