From f67d13f3b39e8eb0690f937a8ede015b3e3d724b Mon Sep 17 00:00:00 2001 From: wp_xxyyzz Date: Tue, 14 Nov 2017 15:22:17 +0000 Subject: [PATCH] fpspreadsheet: Fix html-to-rich-text conversion if text ends with html tag git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@6072 8e941d3f-bd1b-0410-a28a-d453659cc2b4 --- .../source/common/fpshtmlutils.pas | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/components/fpspreadsheet/source/common/fpshtmlutils.pas b/components/fpspreadsheet/source/common/fpshtmlutils.pas index a853a1db1..3224cf717 100644 --- a/components/fpspreadsheet/source/common/fpshtmlutils.pas +++ b/components/fpspreadsheet/source/common/fpshtmlutils.pas @@ -938,15 +938,26 @@ procedure HTMLToRichText(AWorkbook: TsWorkbook; AFont: TsFont; var analyzer: TsHTMLAnalyzer; j: Integer; + len: Integer; + nrtp: Integer; begin analyzer := TsHTMLAnalyzer.Create(AWorkbook, AFont, AHTMLText + ''); try analyzer.PreserveSpaces := true; analyzer.Exec; APlainText := analyzer.PlainText; - SetLength(ARichTextParams, Length(analyzer.RichTextParams)); - for j:=0 to High(ARichTextParams) do - ARichTextParams[j] := analyzer.RichTextParams[j]; + nrtp := Length(analyzer.RichTextParams); + if nrtp > 0 then begin + // Avoid rich-text parameters beyond text end. + len := UTF8Length(APlainText); + if analyzer.RichTextParams[nrtp-1].FirstIndex > len then + dec(nrtp); + // Copy rich-text parameters to output + SetLength(ARichTextParams, nrtp); + for j:=0 to nrtp-1 do + ARichTextParams[j] := analyzer.RichTextParams[j]; + end else + SetLength(ARichTextParams, 0); finally analyzer.Free; end;