信捷PLCSkill
Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.
 
 
 
 

57 řádky
2.0 KiB

  1. import argparse
  2. import pathlib
  3. import sqlite3
  4. import sys
  5. def quoted_phrase(value: str) -> str:
  6. return '"' + value.replace('"', '""') + '"'
  7. def main() -> None:
  8. parser = argparse.ArgumentParser(description="Search the Xinje manual page index without scanning PDFs.")
  9. parser.add_argument("--index", required=True, type=pathlib.Path)
  10. parser.add_argument("--manual", help="Case-insensitive filename substring filter")
  11. parser.add_argument("--limit", type=int, default=12)
  12. parser.add_argument("query", nargs="+")
  13. args = parser.parse_args()
  14. query = " ".join(args.query).strip()
  15. if not query:
  16. raise SystemExit("query cannot be empty")
  17. if args.limit < 1:
  18. raise SystemExit("--limit must be positive")
  19. connection = sqlite3.connect(args.index)
  20. try:
  21. where = ""
  22. parameters = []
  23. if args.manual:
  24. where = " AND lower(filename) LIKE ?"
  25. parameters.append(f"%{args.manual.lower()}%")
  26. try:
  27. rows = connection.execute(
  28. "SELECT filename, pdf_page, snippet(page_search, 3, '[', ']', ' ... ', 18) "
  29. "FROM page_search WHERE page_search MATCH ?" + where + " ORDER BY bm25(page_search) LIMIT ?",
  30. [quoted_phrase(query), *parameters, args.limit],
  31. ).fetchall()
  32. except sqlite3.OperationalError:
  33. rows = []
  34. if not rows:
  35. rows = connection.execute(
  36. "SELECT filename, pdf_page, substr(text, max(1, instr(text, ?) - 120), 420) "
  37. "FROM page_search WHERE instr(text, ?) > 0" + where + " LIMIT ?",
  38. [query, query, *parameters, args.limit],
  39. ).fetchall()
  40. print(f"query: {query}")
  41. print(f"hits: {len(rows)}")
  42. for filename, page, excerpt in rows:
  43. print(f"\n[{filename}] PDF page {page}")
  44. print(excerpt)
  45. finally:
  46. connection.close()
  47. if __name__ == "__main__":
  48. if hasattr(sys.stdout, "reconfigure"):
  49. sys.stdout.reconfigure(encoding="utf-8")
  50. main()