Skip to content

Commit 122df99

Browse files
committed
Refactor TSaveInfoMgr class
Removed much duplicated code & rationalised snippet information document creation.
1 parent 70ef078 commit 122df99

File tree

1 file changed

+50
-110
lines changed

1 file changed

+50
-110
lines changed

Src/USaveInfoMgr.pas

Lines changed: 50 additions & 110 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ interface
2020
UEncodings,
2121
UHTMLSnippetDoc,
2222
USaveSourceDlg,
23+
USnippetDoc,
2324
USourceFileInfo,
2425
UView;
2526

@@ -39,32 +40,6 @@ TSaveInfoMgr = class(TNoPublicConstructObject)
3940
/// <c>ExpectedStr</c> doesn't match <c>EncodedStr</c>.</summary>
4041
class procedure WarnIfDataLoss(const ExpectedStr, EncodedStr: string);
4142

42-
/// <summary>Returns encoded data containing a RTF representation of
43-
/// information about the snippet represented by the given view.</summary>
44-
class function GenerateRichText(View: IView; const AUseHiliting: Boolean):
45-
TEncodedData; static;
46-
47-
/// <summary>Returns encoded data containing a HTML representation of the
48-
/// required snippet information.</summary>
49-
/// <param name="AUseHiliting"><c>Boolean</c> [in] Determines whether
50-
/// source code is syntax highlighted or not.</param>
51-
/// <param name="GeneratorClass"><c>THTMLSnippetDocClass</c> [in] Class of
52-
/// object used to generate the required flavour of HTML.</param>
53-
/// <returns><c>TEncodedData</c>. Required HTML document, encoded as UTF-8.
54-
/// </returns>
55-
function GenerateHTML(const AUseHiliting: Boolean;
56-
const GeneratorClass: THTMLSnippetDocClass): TEncodedData;
57-
58-
/// <summary>Returns encoded data containing a plain text representation of
59-
/// information about the snippet represented by the given view.</summary>
60-
function GeneratePlainText: TEncodedData;
61-
62-
/// <summary>Returns encoded data containing a Markdown representation of
63-
/// information about the snippet represented by the given view.</summary>
64-
/// <returns><c>TEncodedData</c>. Required Markdown document, encoded as
65-
/// UTF-16.</returns>
66-
function GenerateMarkdown: TEncodedData;
67-
6843
/// <summary>Returns type of file selected in the associated save dialogue
6944
/// box.</summary>
7045
function SelectedFileType: TSourceFileType;
@@ -96,6 +71,14 @@ TSaveInfoMgr = class(TNoPublicConstructObject)
9671
procedure EncodingQueryHandler(Sender: TObject;
9772
var Encodings: TSourceFileEncodings);
9873

74+
/// <summary>Returns an instance of the document generator object for the
75+
/// desired file type.</summary>
76+
/// <param name="FileType"><c>TSourceFileType</c> [in] The type of file to
77+
/// be generated.</param>
78+
/// <returns><c>TSnippetDoc</c>. The required document generator object.
79+
/// The caller MUST free this object.</returns>
80+
function GetDocGenerator(const FileType: TSourceFileType): TSnippetDoc;
81+
9982
/// <summary>Generates the required snippet information in the requested
10083
/// format.</summary>
10184
/// <param name="FileType"><c>TSourceFileType</c> [in] Type of file to be
@@ -142,6 +125,7 @@ implementation
142125
Hiliter.UAttrs,
143126
Hiliter.UFileHiliter,
144127
Hiliter.UGlobals,
128+
UExceptions,
145129
UIOUtils,
146130
UMarkdownSnippetDoc,
147131
UMessageBox,
@@ -215,106 +199,62 @@ class procedure TSaveInfoMgr.Execute(View: IView);
215199
end;
216200
end;
217201

218-
function TSaveInfoMgr.GenerateHTML(const AUseHiliting: Boolean;
219-
const GeneratorClass: THTMLSnippetDocClass): TEncodedData;
220-
var
221-
Doc: THTMLSnippetDoc; // object that generates RTF document
222-
HiliteAttrs: IHiliteAttrs; // syntax highlighter formatting attributes
223-
begin
224-
if (fView as ISnippetView).Snippet.HiliteSource and AUseHiliting then
225-
HiliteAttrs := THiliteAttrsFactory.CreateUserAttrs
226-
else
227-
HiliteAttrs := THiliteAttrsFactory.CreateNulAttrs;
228-
Doc := GeneratorClass.Create(HiliteAttrs);
229-
try
230-
Result := Doc.Generate((fView as ISnippetView).Snippet);
231-
finally
232-
Doc.Free;
233-
end;
234-
end;
235-
236-
function TSaveInfoMgr.GenerateMarkdown: TEncodedData;
237-
var
238-
Doc: TMarkdownSnippetDoc;
239-
ExpectedMarkown: string;
240-
begin
241-
Assert(Supports(fView, ISnippetView),
242-
ClassName + '.GenerateMarkdown: View is not a snippet view');
243-
Doc := TMarkdownSnippetDoc.Create(
244-
(fView as ISnippetView).Snippet.Kind <> skFreeform
245-
);
246-
try
247-
// Generate Markdown using default UTF-16 encoding
248-
ExpectedMarkown := Doc.Generate((fView as ISnippetView).Snippet).ToString;
249-
// Convert Markdown to encoding to that selected in save dialogue box
250-
Result := TEncodedData.Create(ExpectedMarkown, fSaveDlg.SelectedEncoding);
251-
// Check for data loss in required encoding
252-
WarnIfDataLoss(ExpectedMarkown, Result.ToString);
253-
finally
254-
Doc.Free;
255-
end;
256-
end;
257-
258202
function TSaveInfoMgr.GenerateOutput(const FileType: TSourceFileType):
259203
TEncodedData;
260204
var
261-
UseHiliting: Boolean;
205+
Doc: TSnippetDoc;
206+
DocData: TEncodedData;
207+
ExpectedText: string;
262208
begin
263-
UseHiliting := fSaveDlg.UseSyntaxHiliting and
264-
TFileHiliter.IsHilitingSupported(FileType);
265-
case FileType of
266-
sfRTF: Result := GenerateRichText(fView, UseHiliting);
267-
sfText: Result := GeneratePlainText;
268-
sfHTML5: Result := GenerateHTML(UseHiliting, THTML5SnippetDoc);
269-
sfXHTML: Result := GenerateHTML(UseHiliting, TXHTMLSnippetDoc);
270-
sfMarkdown: Result := GenerateMarkdown;
271-
end;
272-
end;
273-
274-
function TSaveInfoMgr.GeneratePlainText: TEncodedData;
275-
var
276-
Doc: TTextSnippetDoc; // object that generates plain text document
277-
HiliteAttrs: IHiliteAttrs; // syntax highlighter formatting attributes
278-
ExpectedText: string; // expected plain text
279-
begin
280-
Assert(Supports(fView, ISnippetView),
281-
ClassName + '.GeneratePlainText: View is not a snippet view');
282-
HiliteAttrs := THiliteAttrsFactory.CreateNulAttrs;
283-
Doc := TTextSnippetDoc.Create;
209+
// Create required type of document generator
210+
Doc := GetDocGenerator(FileType);
284211
try
285-
// Generate text using default UTF-16 encoding
286-
ExpectedText := Doc.Generate((fView as ISnippetView).Snippet).ToString;
287-
// Convert encoding to that selected in save dialogue box
288-
Result := TEncodedData.Create(
289-
ExpectedText, fSaveDlg.SelectedEncoding
290-
);
291-
// Check for data loss in required encoding
292-
WarnIfDataLoss(ExpectedText, Result.ToString);
212+
Assert(Assigned(Doc), ClassName + '.GenerateOutput: unknown file type');
213+
// Generate text
214+
DocData := Doc.Generate((fView as ISnippetView).Snippet);
215+
if DocData.EncodingType <> fSaveDlg.SelectedEncoding then
216+
begin
217+
// Required encoding is different to that used to generate document, so
218+
// we need to convert to the desired encoding
219+
ExpectedText := DocData.ToString;
220+
// Convert encoding to that selected in save dialogue box
221+
Result := TEncodedData.Create(
222+
ExpectedText, fSaveDlg.SelectedEncoding
223+
);
224+
// Check for data loss in desired encoding
225+
WarnIfDataLoss(ExpectedText, Result.ToString);
226+
end
227+
else
228+
// Required encoding is same as that used to generate the document
229+
Result := DocData;
293230
finally
294231
Doc.Free;
295232
end;
296233
end;
297234

298-
class function TSaveInfoMgr.GenerateRichText(View: IView;
299-
const AUseHiliting: Boolean): TEncodedData;
235+
function TSaveInfoMgr.GetDocGenerator(const FileType: TSourceFileType):
236+
TSnippetDoc;
300237
var
301-
Doc: TRTFSnippetDoc; // object that generates RTF document
238+
UseHiliting: Boolean;
239+
IsPascalSnippet: Boolean;
302240
HiliteAttrs: IHiliteAttrs; // syntax highlighter formatting attributes
303241
begin
304-
Assert(Supports(View, ISnippetView),
305-
'TSaveInfoMgr.GenerateRichText: View is not a snippet view');
306-
if (View as ISnippetView).Snippet.HiliteSource and AUseHiliting then
242+
IsPascalSnippet := (fView as ISnippetView).Snippet.Kind <> skFreeform;
243+
UseHiliting := fSaveDlg.UseSyntaxHiliting
244+
and TFileHiliter.IsHilitingSupported(FileType)
245+
and (fView as ISnippetView).Snippet.HiliteSource;
246+
if UseHiliting then
307247
HiliteAttrs := THiliteAttrsFactory.CreateUserAttrs
308248
else
309249
HiliteAttrs := THiliteAttrsFactory.CreateNulAttrs;
310-
Doc := TRTFSnippetDoc.Create(HiliteAttrs);
311-
try
312-
// TRTFSnippetDoc generates stream of ASCII bytes
313-
Result := Doc.Generate((View as ISnippetView).Snippet);
314-
Assert(Result.EncodingType = etASCII,
315-
'TSaveInfoMgr.GenerateRichText: ASCII encoded data expected');
316-
finally
317-
Doc.Free;
250+
// Create required type of document generator
251+
case FileType of
252+
sfRTF: Result := TRTFSnippetDoc.Create(HiliteAttrs);
253+
sfText: Result := TTextSnippetDoc.Create;
254+
sfHTML5: Result := THTML5SnippetDoc.Create(HiliteAttrs);
255+
sfXHTML: Result := TXHTMLSnippetDoc.Create(HiliteAttrs);
256+
sfMarkdown: Result := TMarkdownSnippetDoc.Create(IsPascalSnippet);
257+
else Result := nil;
318258
end;
319259
end;
320260

0 commit comments

Comments
 (0)