重构代码,抽象成range,完成段落的重构
This commit is contained in:
@@ -0,0 +1,88 @@
|
||||
type TSFontWare = class
|
||||
public
|
||||
function Create(pdf: PdfFile);
|
||||
function GetFont(name: string; bold: boolean; italic: boolean);
|
||||
function UseExternalFont();
|
||||
function SetSubstitutionRules(source: string; target: string);
|
||||
function SetDefaultSz(value: real);
|
||||
function GetDefaultSz();
|
||||
|
||||
private
|
||||
function GetExternalFont(name:string; bold: boolean; italic: boolean);
|
||||
function GetBuiltInFont(name:string; bold: boolean; italic: boolean);
|
||||
|
||||
private
|
||||
[weakref]pdf_: PdfFile;
|
||||
|
||||
is_linux_: boolean; // 是否是linux
|
||||
use_built_in_font_: boolean; // 是否使用内置字体
|
||||
substitution_rules_: array of string; // 替换规则
|
||||
external_reference_: array of string;
|
||||
default_sz_: real;
|
||||
end;
|
||||
|
||||
function TSFontWare.Create(pdf: PdfFile);
|
||||
begin
|
||||
pdf_ := pdf;
|
||||
use_built_in_font_ := true;
|
||||
substitution_rules_ := array("宋体": "SimSun", "黑体": "SimHei");
|
||||
external_reference_ := array();
|
||||
default_sz_ := 10.5;
|
||||
end;
|
||||
|
||||
function TSFontWare.SetDefaultSz(value: real);
|
||||
begin
|
||||
default_sz_ := value;
|
||||
end;
|
||||
|
||||
function TSFontWare.GetDefaultSz();
|
||||
begin
|
||||
return default_sz_;
|
||||
end;
|
||||
|
||||
function TSFontWare.UseExternalFont();
|
||||
begin
|
||||
use_built_in_font_ := false;
|
||||
end;
|
||||
|
||||
function TSFontWare.GetExternalFont(name:string; bold: boolean; italic: boolean);
|
||||
begin
|
||||
if ifnil(name) or name = '' then name := "等线";
|
||||
if not ifnil(external_font_cache_[name]) then return external_font_cache_[name];
|
||||
value := external_reference_[name];
|
||||
if ifnil(value) then return nil;
|
||||
// if ifnil(value) then raise name + " is unsupported font.";
|
||||
if value["ext"] = ".ttf" then
|
||||
font_name := pdf_.LoadTTFontFromFile("", value["path"], true);
|
||||
else if value["ext"] = ".ttc" then
|
||||
font_name := pdf_.LoadTTFontFromFile2("", value["path"], 0, true);
|
||||
// if not ifString(font_name) then raise "Load font error : " + format("%x", font_name);
|
||||
if not ifString(font_name) then return nil;
|
||||
font := pdf_.GetFont(font_name, "UTF-8");
|
||||
external_font_cache_[name] := font;
|
||||
return font;
|
||||
end;
|
||||
|
||||
function TSFontWare.GetFont(name: string; bold: boolean; italic: boolean);
|
||||
begin
|
||||
return use_built_in_font_ ? self.GetBuiltInFont(name, bold, italic) : self.GetExternalFont(name, bold, italic);
|
||||
end;
|
||||
|
||||
function TSFontWare.GetBuiltInFont(name: string; bold: boolean; italic: boolean);
|
||||
begin
|
||||
font_name := substitution_rules_["name"];
|
||||
if ifnil(font_name) then font_name := "SimSun";
|
||||
if bold and italic then
|
||||
font_name += ",BoldItalic";
|
||||
else if bold then
|
||||
font_name += ",Bold";
|
||||
else if italic then
|
||||
font_name += ",Italic";
|
||||
font := pdf_.GetFont(font_name, "GBK-EUC-H");
|
||||
return font;
|
||||
end;
|
||||
|
||||
function TSFontWare.SetSubstitutionRules(source: string; target: string);
|
||||
begin
|
||||
substitution_rules_[source] := target;
|
||||
end;
|
||||
@@ -0,0 +1,48 @@
|
||||
type TSNumberingWare = class
|
||||
public
|
||||
function Create(number: NumberingAdapter);
|
||||
function GetNumberLvl(ppr: PPr);
|
||||
|
||||
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_.NumId(num_id);
|
||||
abstract_id := num.AbstractNumId.Val;
|
||||
abstract_num := numbering_adapter_.AbstractNumId(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 := i = ilvl_int ? num_hash_[num_id][i] + 1 : num_hash_[num_id][i];
|
||||
dest_str := format("%d", 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
|
||||
@@ -0,0 +1,27 @@
|
||||
type TSSectWare = class
|
||||
public
|
||||
function Create();
|
||||
function Do();
|
||||
|
||||
public
|
||||
Elements: array of tslobj;
|
||||
SectPr: SectPr;
|
||||
BaseSize: integer;
|
||||
end;
|
||||
|
||||
function TSSectWare.Create();
|
||||
begin
|
||||
self.Elements := array();
|
||||
self.SectPr := nil;
|
||||
self.BaseSize := 0;
|
||||
end;
|
||||
|
||||
function TSSectWare.Do();
|
||||
begin
|
||||
if ifObj(self.SectPr) then
|
||||
self.BaseSize := round(self.SectPr.DocGrid.LinePitch * 0.75);
|
||||
// println("LinePitch = {}, Type = {}", self.SectPr.DocGrid.LinePitch, self.SectPr.DocGrid.Type);
|
||||
// println("Width = {}, Height = {}", self.SectPr.PgSz.W, self.SectPr.PgSz.H);
|
||||
// println("Top = {}, Right = {}, Bottom = {}, Left = {}, Header = {}, Footer = {}\n",
|
||||
// self.SectPr.PgMar.Top, self.SectPr.PgMar.Right, self.SectPr.PgMar.Bottom, self.SectPr.PgMar.Left, self.SectPr.PgMar.Header, self.SectPr.PgMar.Footer);
|
||||
end;
|
||||
Reference in New Issue
Block a user