fpspreadsheet: Improved interpretation of text-position attribute by ods reader (see forum http://forum.lazarus.freepascal.org/index.php/topic,34687.msg227906.html).

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@5315 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
wp_xxyyzz
2016-11-05 16:49:34 +00:00
parent 1d40bd7687
commit eb29f677d7

View File

@ -2061,8 +2061,10 @@ end;
procedure TsSpreadOpenDocReader.ReadFont(ANode: TDOMNode; var AFontName: String; procedure TsSpreadOpenDocReader.ReadFont(ANode: TDOMNode; var AFontName: String;
var AFontSize: Single; var AFontStyle: TsFontStyles; var AFontColor: TsColor; var AFontSize: Single; var AFontStyle: TsFontStyles; var AFontColor: TsColor;
var AFontPosition: TsFontPosition); var AFontPosition: TsFontPosition);
const
EPS = 1E-6;
var var
stylename, s: String; stylename, s, s1, s2: String;
i, p: Integer; i, p: Integer;
begin begin
if ANode = nil then if ANode = nil then
@ -2093,23 +2095,47 @@ begin
if GetAttrValue(ANode, 'fo:font-style') = 'italic' then if GetAttrValue(ANode, 'fo:font-style') = 'italic' then
Include(AFontStyle, fssItalic); Include(AFontStyle, fssItalic);
if GetAttrValue(ANode, 'fo:font-weight') = 'bold' then if GetAttrValue(ANode, 'fo:font-weight') = 'bold' then
Include(AFontStyle, fssBold); Include(AFontStyle, fssBold);
s := GetAttrValue(ANode, 'style:text-underline-style'); s := GetAttrValue(ANode, 'style:text-underline-style');
if not ((s = '') or (s = 'none')) then if not ((s = '') or (s = 'none')) then
Include(AFontStyle, fssUnderline); Include(AFontStyle, fssUnderline);
s := GetAttrValue(ANode, 'style:text-line-through-style'); s := GetAttrValue(ANode, 'style:text-line-through-style');
if s = '' then s := GetAttrValue(ANode, 'style:text-line-through-type'); if s = '' then s := GetAttrValue(ANode, 'style:text-line-through-type');
if not ((s = '') or (s = 'none')) then if not ((s = '') or (s = 'none')) then
Include(AFontStyle, fssStrikeout); Include(AFontStyle, fssStrikeout);
{ The "style:text-position" attribute specifies whether text is positioned
above or below the baseline and defines the relative font height that is
used for this text. The attribute can have one or two values.
1st value: percentage of vertical text displacement, or "super" or "sub"
2nd value: percentage of font height used for text (optional) }
s := GetAttrValue(ANode, 'style:text-position'); s := GetAttrValue(ANode, 'style:text-position');
if Length(s) >= 3 then if s <> '' then
begin begin
if (s[3] = 'b') or (s[1] = '-') then p := pos(' ', s);
if p > 0 then
begin
s1 := Copy(s, 1, p-1);
s2 := Copy(s, p+1, MaxInt);
end else
begin
s1 := s;
s2 := '100';
end;
if s1[Length(s1)] = '%' then SetLength(s1, Length(s1) - 1);
if s2[Length(s2)] = '%' then SetLength(s2, Length(s2) - 1);
if s1 = 'super' then
AFontPosition := fpSuperscript
else if s1 = 'sub' then
AFontPosition := fpSubscript AFontPosition := fpSubscript
else else if SameValue(StrToFloat(s1, FPointSeparatorSettings), 0.0, EPS) then
AFontPosition := fpSuperscript; AFontPosition := fpNormal
else if s1[1] = '-' then
AFontPosition := fpSubScript;
end; end;
s := GetAttrValue(ANode, 'fo:color'); s := GetAttrValue(ANode, 'fo:color');