Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 35 additions & 5 deletions src/lazydocs/generation.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,8 @@
)

_RE_TYPED_ARGSTART = re.compile(r"^([\w\[\]_]{1,}?)[ ]*?\((.*?)\):[ ]+(.{2,})", re.IGNORECASE)
_RE_ARGSTART = re.compile(r"^(.+):[ ]+(.{2,})$", re.IGNORECASE)
# Restrict to valid Python identifier-like patterns to avoid matching URLs
_RE_ARGSTART = re.compile(r"^([\w\[\]_]+):[ ]+(.{2,})$", re.IGNORECASE)

_RE_CODE_TEXT = re.compile(r"^```[\w\-\.]*[ ]*$", re.IGNORECASE)

Expand Down Expand Up @@ -583,11 +584,40 @@ def _lines_isvalid(lines: list, start_index: int, blockindent: int,
argindent = indent
elif arg_list and not literal_block and _RE_ARGSTART.match(line):
# start of an exception-type block
out.append(
"- "
+ _RE_ARGSTART.sub(r"<b>`\1`</b>: \2", line)
# Check if this looks like a URL being incorrectly parsed
match = _RE_ARGSTART.match(line)
# Check if the part before the colon contains URL indicators or
# is likely descriptive text rather than an argument name
before_colon = match.group(1) if match else ""

# Heuristics to detect non-argument lines:
# 1. The text before colon contains "http" (part of a URL)
# 2. The line contains "://" (URL protocol)
# 3. The text before colon is too long to be an argument name (>40 chars)
# 4. The text before colon contains common English words that aren't argument names
common_words = ["see", "to find", "refer", "documentation", "available"]
is_not_argument = (
"http" in before_colon.lower() or
"://" in line or
len(before_colon) > 40 or
any(word in before_colon.lower() for word in common_words)
)
argindent = indent

if match and is_not_argument:
# This is likely descriptive text with a colon, not an argument
# Treat it as regular text continuation
if argindent > 0:
padding = max(indent - argindent + offset, 0)
out.append(" " * padding + line.replace("\n", "\n" + " " * padding))
else:
out.append(line)
else:
# This is a real argument
out.append(
"- "
+ _RE_ARGSTART.sub(r"<b>`\1`</b>: \2", line)
)
argindent = indent
elif indent > argindent:
# attach docs text of argument
# * (blockindent + 2)
Expand Down
Loading