| 404 | |
| 405 | |
| 406 | def explain_program(program, store, distro=None, release=None): |
| 407 | mps = store.find_man_page(program, distro=distro, release=release) |
| 408 | raw_mp = mps.pop(0) |
| 409 | program = raw_mp.name_section |
| 410 | |
| 411 | synopsis = raw_mp.synopsis |
| 412 | if not synopsis: |
| 413 | synopsis = None |
| 414 | |
| 415 | url = manpage_url(raw_mp.source) |
| 416 | |
| 417 | mp = { |
| 418 | "source": os.path.basename(raw_mp.source)[:-3], |
| 419 | "section": raw_mp.section, |
| 420 | "program": program, |
| 421 | "synopsis": synopsis, |
| 422 | "options": [render_markdown(o.text) for o in raw_mp.options], |
| 423 | "url": url, |
| 424 | } |
| 425 | |
| 426 | debug_info = {} |
| 427 | if config.DEBUG: |
| 428 | for i, o in enumerate(raw_mp.options): |
| 429 | debug_info[f"option-{i}"] = { |
| 430 | "kind": "option", |
| 431 | "short": o.short, |
| 432 | "long": o.long, |
| 433 | "has_argument": o.has_argument, |
| 434 | "positional": o.positional, |
| 435 | "prefix": o.prefix, |
| 436 | "nested_cmd": o.nested_cmd, |
| 437 | "meta": o.meta, |
| 438 | } |
| 439 | |
| 440 | suggestions = [] |
| 441 | for other_mp in mps: |
| 442 | d = { |
| 443 | "text": other_mp.name_section, |
| 444 | "link": f"{other_mp.section}/{other_mp.name}", |
| 445 | } |
| 446 | suggestions.append(d) |
| 447 | logger.info("suggestions: %s", suggestions) |
| 448 | return mp, suggestions, raw_mp, debug_info |
| 449 | |
| 450 | |
| 451 | def _make_match(start, end, match, cmd_class, help_class): |