• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

rafalp / Misago / 14252691788

03 Apr 2025 09:01PM UTC coverage: 97.097% (-0.08%) from 97.173%
14252691788

push

github

web-flow
Replace default parser with `markdown-it-py` (#1901)

1902 of 1969 new or added lines in 66 files covered. (96.6%)

20 existing lines in 7 files now uncovered.

68959 of 71021 relevant lines covered (97.1%)

0.97 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

95.38
/misago/parser/plugins/urlbbcode.py
1
from markdown_it import MarkdownIt
1✔
2
from markdown_it.rules_inline.state_inline import StateInline
1✔
3

4

5
def url_bbcode_plugin(md: MarkdownIt):
1✔
6
    md.inline.ruler.before("link", "url_bbcode", url_bbcode_rule)
1✔
7

8

9
def url_bbcode_rule(state: StateInline, silent: bool):
1✔
10
    if state.linkLevel:
1✔
11
        return False
1✔
12

13
    start = state.pos
1✔
14
    maximum = state.posMax
1✔
15

16
    args_start = None
1✔
17
    args_end = None
1✔
18
    args_str = None
1✔
19

20
    content_start = None
1✔
21
    content_end = None
1✔
22

23
    if maximum - start < 11:
1✔
24
        return False
1✔
25

26
    if state.src[start : start + 4].lower() != "[url":
1✔
27
        return False
1✔
28

29
    if state.src[start + 4] == "=":
1✔
30
        if "]" not in state.src[start + 5 : maximum]:
1✔
NEW
31
            return False
×
32

33
        args_start = start + 5
1✔
34
        content_start = state.src.index("]", args_start) + 1
1✔
35
        args_end = content_start - 1
1✔
36

37
        args_str = state.src[args_start:args_end].strip() or None
1✔
38
        if args_str and (
1✔
39
            (args_str[0] == '"' and args_str[-1] == '"')
40
            or (args_str[0] == "'" and args_str[-1] == "'")
41
        ):
42
            args_str = args_str[1:-1].strip()
1✔
43
    else:
44
        content_start = start + 5
1✔
45

46
    pos = content_start
1✔
47
    while pos + 6 <= maximum:
1✔
48
        if state.src[pos : pos + 6].lower() == "[/url]":
1✔
49
            break
1✔
50

51
        pos += 1
1✔
52

53
    if state.src[pos : pos + 6].lower() != "[/url]":
1✔
NEW
54
        return False
×
55

56
    content_end = pos
1✔
57
    end = content_end + 6
1✔
58

59
    content = state.src[content_start:content_end]
1✔
60

61
    if args_start and args_end and not args_str:
1✔
62
        return False  # Eject if [url=]...[/url]
1✔
63

64
    if not content.strip():
1✔
65
        return False  # Eject if [url][/url]
1✔
66

67
    if args_str:
1✔
68
        href = state.md.normalizeLink(args_str)
1✔
69
    else:
70
        href = state.md.normalizeLink(content.strip())
1✔
71

72
    if not state.md.validateLink(href):
1✔
NEW
73
        return False
×
74

75
    pos_max_org = state.posMax
1✔
76

77
    if not silent:
1✔
78
        token = state.push("link_open", "a", 1)
1✔
79
        token.markup = state.src[start:content_start]
1✔
80
        token.attrs = {"href": href}
1✔
81

82
        if args_str:
1✔
83
            state.pos = content_start
1✔
84
            state.posMax = content_end
1✔
85
            state.linkLevel += 1
1✔
86
            state.md.inline.tokenize(state)
1✔
87
            state.linkLevel -= 1
1✔
88
        else:
89
            token = state.push("text", "", 0)
1✔
90
            token.content = state.md.normalizeLinkText(content)
1✔
91

92
        token = state.push("link_close", "a", -1)
1✔
93
        token.markup = "[/url]"
1✔
94

95
    state.pos = end
1✔
96
    state.posMax = pos_max_org
1✔
97

98
    return True
1✔
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc