def render_colon_fence(self, token: Token): """Render a code fence with ``:`` colon delimiters.""" # TODO remove deprecation after v0.13.0 match = REGEX_ADMONTION.match(token.info.strip()) if match and match.groupdict( )["name"] in list(STD_ADMONITIONS) + ["figure"]: classes = match.groupdict()["classes"][1:].split(",") name = match.groupdict()["name"] if classes and classes[0]: self.current_node.append( self.reporter.warning( "comma-separated classes are deprecated, " "use `:class:` option instead", line=token_line(token), )) # we assume that no other options have been used token.content = f":class: {' '.join(classes)}\n\n" + token.content if name == "figure": self.current_node.append( self.reporter.warning( ":::{figure} is deprecated, " "use :::{figure-md} instead", line=token_line(token), )) name = "figure-md" token.info = f"{{{name}}} {match.groupdict()['title']}" if token.content.startswith(":::"): # the content starts with a nested fence block, # but must distinguish between ``:options:``, so we add a new line token.content = "\n" + token.content return self.render_fence(token)
def todoify(token: Token, token_constructor): token.children.insert(0, make_checkbox(token, token_constructor)) token.children[1].content = token.children[1].content[3:] token.content = token.content[3:] if use_label_wrapper: if use_label_after: token.children.pop() # Replaced number generator from original plugin with uuid. checklist_id = f"task-item-{uuid4()}" token.children[0].content = (token.children[0].content[0:-1] + f' id="{checklist_id}">') token.children.append( after_label(token.content, checklist_id, token_constructor)) else: token.children.insert(0, begin_label(token_constructor)) token.children.append(end_label(token_constructor))
def footnote_tail(state: StateBlock, *args, **kwargs): """Post-processing step, to move footnote tokens to end of the token stream. Also removes un-referenced tokens. """ insideRef = False refTokens = {} if "footnotes" not in state.env: return current = [] tok_filter = [] for tok in state.tokens: if tok.type == "footnote_reference_open": insideRef = True current = [] currentLabel = tok.meta["label"] tok_filter.append(False) continue if tok.type == "footnote_reference_close": insideRef = False # prepend ':' to avoid conflict with Object.prototype members refTokens[":" + currentLabel] = current tok_filter.append(False) continue if insideRef: current.append(tok) tok_filter.append((not insideRef)) state.tokens = [t for t, f in zip(state.tokens, tok_filter) if f] if "list" not in state.env.get("footnotes", {}): return foot_list = state.env["footnotes"]["list"] token = Token("footnote_block_open", "", 1) state.tokens.append(token) for i, foot_note in foot_list.items(): token = Token("footnote_open", "", 1) token.meta = {"id": i, "label": foot_note.get("label", None)} # TODO propagate line positions of original foot note # (but don't store in token.map, because this is used for scroll syncing) state.tokens.append(token) if "tokens" in foot_note: tokens = [] token = Token("paragraph_open", "p", 1) token.block = True tokens.append(token) token = Token("inline", "", 0) token.children = foot_note["tokens"] token.content = foot_note["content"] tokens.append(token) token = Token("paragraph_close", "p", -1) token.block = True tokens.append(token) elif "label" in foot_note: tokens = refTokens[":" + foot_note["label"]] state.tokens.extend(tokens) if state.tokens[len(state.tokens) - 1].type == "paragraph_close": lastParagraph = state.tokens.pop() else: lastParagraph = None t = (foot_note["count"] if (("count" in foot_note) and (foot_note["count"] > 0)) else 1) j = 0 while j < t: token = Token("footnote_anchor", "", 0) token.meta = { "id": i, "subId": j, "label": foot_note.get("label", None) } state.tokens.append(token) j += 1 if lastParagraph: state.tokens.append(lastParagraph) token = Token("footnote_close", "", -1) state.tokens.append(token) token = Token("footnote_block_close", "", -1) state.tokens.append(token)