tech-bid-manage20260423/utils/outline_numbering.py
2026-04-23 14:37:19 +08:00

53 lines
1.6 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
标书目录号展示:一级为汉字+顿号,子级为数字多级编号(与 AI 大纲示例一致)。
"""
from __future__ import annotations
def int_to_chinese_numeral(n: int) -> str:
"""将正整数转为中文数字(一、二、…、十、十一、…、九十九、一百)。"""
if n <= 0:
return str(n)
digits = "零一二三四五六七八九"
if n < 10:
return digits[n]
if n == 10:
return ""
if n < 20:
return "" + (digits[n % 10] if n % 10 else "")
if n < 100:
t, o = divmod(n, 10)
s = digits[t] + ""
if o:
s += digits[o]
return s
if n < 1000:
h, r = divmod(n, 100)
s = digits[h] + ""
if r == 0:
return s
if r < 10:
return s + "" + digits[r]
return s + int_to_chinese_numeral(r)
# 极少需要百级以上章,保守处理
return str(n)
def format_heading_display(level: int, section_number: str, title: str) -> str:
"""
生成带目录号的章节展示行用于大纲文本、Word 标题、目录页)。
- 一级:汉字、顿号 + 标题,如「一、总体方案」
- 二级及以下「1.1 子标题」
"""
title = (title or "").strip()
sn = (section_number or "").strip()
lv = int(level) if level else 1
if lv <= 1:
main = sn.split(".")[0]
try:
idx = int(main)
except ValueError:
idx = 1
return f"{int_to_chinese_numeral(idx)}{title}"
return f"{sn} {title}".strip()