89 lines
3.0 KiB
Plaintext
89 lines
3.0 KiB
Plaintext
type TSNumberingWare = class
|
|
public
|
|
function Create(number: NumberingAdapter);
|
|
function GetNumberLvl(ppr: PPr);
|
|
|
|
private
|
|
function CalculateNumber(num_fmt: string; num: integer): string;
|
|
function ChineseCountingThousand(n: integer): string;
|
|
|
|
private
|
|
numbering_adapter_: NumberingAdapter;
|
|
num_hash_: array of tslobj;
|
|
end;
|
|
|
|
function TSNumberingWare.Create(number: NumberingAdapter);
|
|
begin
|
|
numbering_adapter_ := new NumberingAdapter(number);
|
|
num_hash_ := array();
|
|
end;
|
|
|
|
function TSNumberingWare.GetNumberLvl(ppr: PPr);
|
|
begin
|
|
num_id := ppr.NumPr.NumId.Val;
|
|
if ifnil(num_id) then return array("", nil);
|
|
ilvl := ppr.NumPr.Ilvl.Val;
|
|
pstyle := ppr.PStyle.Val;
|
|
num := numbering_adapter_.GetNumByNumId(num_id);
|
|
if ifnil(num) then return array("", nil);
|
|
abstract_id := num.AbstractNumId.Val;
|
|
abstract_num := numbering_adapter_.GetAbstractNumByAbstractNumId(abstract_id);
|
|
lvls := abstract_num.Lvls();
|
|
if ifnil(ilvl) then ilvl := "0";
|
|
for k,v in lvls do
|
|
begin
|
|
if ilvl and v.Ilvl = ilvl then
|
|
begin
|
|
lvl_text := v.LvlText.Val;
|
|
if not ifarray(num_hash_[num_id]) then num_hash_[num_id] := array(0, 0, 0, 0, 0, 0, 0, 0, 0);
|
|
ilvl_int := strtoint(ilvl);
|
|
for i:=0 to ilvl_int do
|
|
begin
|
|
source_str := "%" $ (i + 1);
|
|
n := num_hash_[num_id][i];
|
|
if i = ilvl_int then
|
|
begin
|
|
n := num_hash_[num_id][i] + 1;
|
|
for j:=i+1 to length(num_hash_[num_id])-1 do
|
|
num_hash_[num_id][j] := 0;
|
|
end
|
|
n := i = ilvl_int ? num_hash_[num_id][i] + 1 : num_hash_[num_id][i];
|
|
dest_str := {self.}CalculateNumber(v.NumFmt.Val, n);
|
|
lvl_text := replaceStr(lvl_text, source_str, dest_str);
|
|
end
|
|
num_hash_[num_id][ilvl_int]++;
|
|
if v.Suff.Val = "space" then lvl_text += " ";
|
|
return array(lvl_text, v);
|
|
end
|
|
end
|
|
return array("", nil);
|
|
end
|
|
|
|
function TSNumberingWare.CalculateNumber(num_fmt: string; num: integer): string;
|
|
begin
|
|
if num_fmt = "decimal" then
|
|
return format("%d", num);
|
|
else if num_fmt = "chineseCountingThousand" then
|
|
return {self.}ChineseCountingThousand(num);
|
|
else
|
|
return format("%d", num);
|
|
end;
|
|
|
|
function TSNumberingWare.ChineseCountingThousand(n: integer): string;
|
|
begin
|
|
chinese_digits := array("零", "一", "二", "三", "四", "五", "六", "七", "八", "九");
|
|
chinese_units := array("", "十", "百", "千");
|
|
if n < 10 then return chinese_digits[n];
|
|
result := "";
|
|
num_str := inttostr(n);
|
|
len := length(num_str);
|
|
for i:=1 to len do
|
|
begin
|
|
digit_int := strtoint(num_str[i]);
|
|
if digit_int <> 0 then
|
|
result += chinese_digits[digit_int] + chinese_units[len - i];
|
|
end
|
|
if length(result) >= 6 and result[:6] = "一十" then result := result[4:];
|
|
return result;
|
|
end;
|