You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			51 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Python
		
	
			
		
		
	
	
			51 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Python
		
	
import re
 | 
						|
import string
 | 
						|
from typing import TYPE_CHECKING, Match
 | 
						|
 | 
						|
if TYPE_CHECKING:
 | 
						|
    from ..block_parser import BlockParser
 | 
						|
    from ..core import BlockState, InlineState
 | 
						|
    from ..inline_parser import InlineParser
 | 
						|
    from ..markdown import Markdown
 | 
						|
 | 
						|
# because mismatch is too slow, add parsers for paragraph and text
 | 
						|
 | 
						|
HARD_LINEBREAK_RE = re.compile(r" *\n\s*")
 | 
						|
PARAGRAPH = (
 | 
						|
    # start with none punctuation, not number, not whitespace
 | 
						|
    r"(?:^[^\s\d" + re.escape(string.punctuation) + r"][^\n]*\n)+"
 | 
						|
)
 | 
						|
 | 
						|
__all__ = ["speedup"]
 | 
						|
 | 
						|
 | 
						|
def parse_text(inline: "InlineParser", m: Match[str], state: "InlineState") -> int:
 | 
						|
    text = m.group(0)
 | 
						|
    text = HARD_LINEBREAK_RE.sub("\n", text)
 | 
						|
    inline.process_text(text, state)
 | 
						|
    return m.end()
 | 
						|
 | 
						|
 | 
						|
def parse_paragraph(block: "BlockParser", m: Match[str], state: "BlockState") -> int:
 | 
						|
    text = m.group(0)
 | 
						|
    state.add_paragraph(text)
 | 
						|
    return m.end()
 | 
						|
 | 
						|
 | 
						|
def speedup(md: "Markdown") -> None:
 | 
						|
    """Increase the speed of parsing paragraph and inline text."""
 | 
						|
    md.block.register("paragraph", PARAGRAPH, parse_paragraph)
 | 
						|
 | 
						|
    punc = r"\\><!\[_*`~\^\$="
 | 
						|
    text_pattern = r"[\s\S]+?(?=[" + punc + r"]|"
 | 
						|
    if "url_link" in md.inline.rules:
 | 
						|
        text_pattern += "https?:|"
 | 
						|
 | 
						|
    if md.inline.hard_wrap:
 | 
						|
        text_pattern += r" *\n|"
 | 
						|
    else:
 | 
						|
        text_pattern += r" {2,}\n|"
 | 
						|
 | 
						|
    text_pattern += r"$)"
 | 
						|
    md.inline.register("text", text_pattern, parse_text)
 |