def run(self, reader: TextReader, document: Element) -> bool: brackets = list(n for n in document.children if isinstance(n, bracket)) openers = list(d for d in brackets if d['can_open']) if openers == []: return False matched = reader.consume(self.pattern) rubytext = unescape(matched.group(0)[2:-1]) ruby = addnodes.ruby(rubytext=rubytext) document += ruby # transplant ruby base text to ruby node transplant_nodes(document, ruby, start=openers[-1], end=ruby) document.remove(openers[-1]) return True
def process_link_or_image(self, reader: TextReader, document: Element) -> bool: brackets = list(n for n in document.children if isinstance(n, addnodes.bracket)) openers = list(d for d in brackets if d['can_open']) if len(openers) == 0: return True opener = openers.pop() closer = brackets.pop() if not opener['active']: opener.replace_self(Text(opener['marker'])) closer.replace_self(Text(closer['marker'])) return True try: if reader.remain.startswith('('): # link destination + link title (optional) # [...](<.+> ".+") # [...](.+ ".+") destination, title = self.parse_link_destination( reader, document) elif reader.remain.startswith('['): # link label # [...][.+] # [...][] destination, title = self.parse_link_label(reader, document, opener=opener, closer=closer) else: destination = None title = None except (TypeError, ValueError): destination = None title = None if destination is None: # shortcut reference link # [...] refid = reader[opener['position']:closer['position']] target = self.lookup_target(document, refid) if target: destination = target.get('refuri') title = target.get('title') else: # deactivate brackets because no trailing link destination or link-label opener.replace_self(Text(opener['marker'])) closer.replace_self(Text(closer['marker'])) raise elif destination == LABEL_NOT_MATCHED: opener.replace_self(Text(opener['marker'])) closer.replace_self(Text(closer['marker'])) raise node: Element = None if opener['marker'] == '![': from pycmark.transforms import EmphasisConverter # lazy loading para = transplant_nodes(document, nodes.paragraph(), start=opener, end=closer) EmphasisConverter(para).apply() node = nodes.image('', uri=destination, alt=para.astext()) if title: node['title'] = title else: node = nodes.reference('', refuri=destination) transplant_nodes(document, node, start=opener, end=closer) if title: node['reftitle'] = title # deactivate all left brackets before the link for n in openers: if n['marker'] == '[': n['active'] = False document += node document.remove(opener) document.remove(closer) return True